numpy.cross
numpy.cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None)
Функция cross() вычисляет векторное произведение двух векторов a
и b
в трехмерном пространстве. Так как речь идет о трехмерном пространстве, то векторы a
и b
, должны содержать три компоненты: x, y, z. Если один из векторов содержит две компоненты, то третья компонента предполагается равной 0 и вычисление производится как обычно. Если оба вектора состоят всего из двух компонент, то будет возвращено одно число - z компонента векторного произведения.
Массивы a
и b
могут быть как векторами так и массивами векторов. В последнем случае, векторы определяются последней осью, которая не может содержать меньше 2 и больше 3 элементов.
-
- a - массив NumPy или подобный массиву объект
- Компоненты первого вектора (векторов).
- b - массив NumPy или подобный массиву объект
- Компоненты второго вектора (векторов).
- axisa - целое число (необязательный)
- Определяет ось, в направлении которой формируются компоненты вектора
a
(по умолчанию последняя ось). - axisb - массив NumPy или подобный массиву объект
- Определяет ось, в направлении которой формируются компоненты вектора
b
(по умолчанию последняя ось). - axisc - массив NumPy или подобный массиву объект
- Определяет ось, в направлении которой формируются компоненты векторного произведения
a
(по умолчанию последняя ось). Параметр игнорируется, если входные векторы состоят всего из двух компонент, так как результат такого произведения является скаляром, а не вектором. - axis - массив NumPy или подобный массиву объект
- Определяет одинаковую ось всех трех массивов.
-
- результат - число или массив NumPy
- Число, вектор или массив с результатом векторного произведения.
Замечание
С версии 1.9.0 поддерживает транслирование входных массивов.
Примеры
Векторное произведение двух векторов из трех компонет:
>>> import numpy as np
>>>
>>> a = [2, 3, 5]
>>> b = [7, 11, 13]
>>>
>>> np.cross(a, b)
array([-16, 9, 1])
Если один из векторов состоит всего из двух компонент, то предполагается, что у него все-таки есть третья компонента, которая просто равна нулю:
>>> a = [1, 7]
>>> x = [1, 7, 0]
>>> b = [1, 3, 7]
>>>
>>> np.cross(a, b)
array([49, -7, -4])
>>> np.cross(x, b)
array([49, -7, -4])
Если оба вектора состоят всего из двух компонент, то возвращается длина (третья компонента) результирующего вектора:
>>> a = [2, 5]
>>> b = [1, 4]
>>> np.cross(a, b)
array(3)
Если a
и b
- это массивы векторов, то будет выполнено их поэлементное векторное умножение:
>>> a = np.arange(1, 10).reshape(3, 3)
>>> b = np.arange(9, 0, -1).reshape(3, 3)
>>>
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b
array([[9, 8, 7],
[6, 5, 4],
[3, 2, 1]])
>>>
>>>
>>> # Обратите внимание на выполнение правила правой руки
... # при вычислении векторного произведения:
... np.cross(a, b)
array([[-10, 20, -10],
[-10, 20, -10],
[-10, 20, -10]])
>>>
>>> np.cross(b, a)
array([[ 10, -20, 10],
[ 10, -20, 10],
[ 10, -20, 10]])
>>>
>>>
>>> # Данная функция поддерживает механизм
... # транслирования массивов:
>>> a = np.arange(1, 10).reshape(3, 3)
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b = [9, 8, 7]
>>>
>>> np.cross(a, b)
array([[-10, 20, -10],
[-13, 26, -13],
[-16, 32, -16]])
Изменить ориентацию выхоного массива можно с помощью параметра axisc
:
>>> a = np.arange(1, 13).reshape(4, 3)
>>> b = np.arange(12, 0, -1).reshape(4, 3)
>>>
>>> a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
>>> b
array([[12, 11, 10],
[ 9, 8, 7],
[ 6, 5, 4],
[ 3, 2, 1]])
>>>
>>>
>>> np.cross(a, b) # по умолчанию, axisc = 1
array([[-13, 26, -13],
[-13, 26, -13],
[-13, 26, -13],
[-13, 26, -13]])
>>>
>>> np.cross(a, b, axisc = 0)
array([[-13, -13, -13, -13],
[ 26, 26, 26, 26],
[-13, -13, -13, -13]])
>>>
Так же мы можем изменить направление векторов a
и b
, указав их в соответствующих параметрах axisa
и axisb
:
>>> a = np.arange(1, 10).reshape(3, 3)
>>> b = np.arange(9, 0, -1).reshape(3, 3)
>>>
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b
array([[9, 8, 7],
[6, 5, 4],
[3, 2, 1]])
>>>
>>>
>>> np.cross(a, b)
array([[-10, 20, -10],
[-10, 20, -10],
[-10, 20, -10]])
>>>
>>> np.cross(a, b, axisa = 0)
array([[-28, 56, -28],
[-20, 40, -20],
[-12, 24, -12]])
>>>
>>> # Эквивалентно:
>>> np.cross(a.T, b)
array([[-28, 56, -28],
[-20, 40, -20],
[-12, 24, -12]])
Задать одинаковую ось всех трех массивов можно с помощью параметра axis
:
>>> np.cross(a, b, axis = 0)
array([[-30, -30, -30],
[ 60, 60, 60],
[-30, -30, -30]])
>>>
>>> np.cross(a, b, axisa = 0, axisb = 0, axisc = 0)
array([[-30, -30, -30],
[ 60, 60, 60],
[-30, -30, -30]])