numpy.cross

numpy.cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None)

Функция numpy.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]])