Перекрестное произведение вектора в NumPy

рассмотрим следующие векторы (по существу2x1 матрицы):

a = sc.array([[1], [2], [3]])
>>> a
[[1]
 [2]
 [3]]

b = sc.array([[4], [5], [6]])
>>> b
[[4]
 [5]
 [6]]

перекрестное произведение этих векторов можно вычислить с помощью numpy.cross(). Почему это не работает:

import numpy as np 

np.cross(a, b)
ValueError: incompatible dimensions for cross product
(dimension must be 2 or 3)

но это никак?:

np.cross(a.T, b.T)
[[-3  6 -3]]

3 ответов


для вычисления перекрестного произведения с помощью numpy.cross размер (длина) размерность массива, который определяет два вектора должны быть либо два, либо три. Чтобы процитировать документацию:

если a и b массивы векторов, векторы определяются последней осью a и b по умолчанию, и эти оси может иметь размеры 2 или 3.

обратите внимание, что по умолчанию используется последняя ось. В пример:

In [17]: a = np.array([[1], [2], [3]])

In [18]: b = np.array([[4], [5], [6]])

In [19]: print a.shape,b.shape
(3, 1) (3, 1)

последняя ось имеет только длину 1, поэтому перекрестное произведение не определено. Однако, если вы используете транспонирование, длина вдоль последней оси 3, так он действует. Вы также можете сделать:

In [20]: np.cross(a,b,axis=0)
Out[20]: 
array([[-3],
       [ 6],
       [-3]])

что говорит cross что векторы определены вдоль первой оси, а не последней оси.


в numpy мы часто используем массивы 1d для представления векторов, и мы рассматриваем его как вектор строки или вектор столбца в зависимости от контекста, например:

In [13]: a = np.array([1, 2, 3])

In [15]: b = np.array([4, 5, 6])

In [16]: np.cross(a, b)
Out[16]: array([-3,  6, -3])

In [17]: np.dot(a, b)
Out[17]: 32

вы можете хранить векторы как 2D-массивы, это наиболее полезно, когда у вас есть коллекция векторов, которые вы хотите обработать аналогичным образом. Например, если я хочу пересечь 4 вектора в a с 4 векторами в b. По умолчанию numpy предполагает, что векторы находятся вдоль последних измерений, но можно использовать аргументы axisa и axisb чтобы явно указать, что векторы вдоль первого измерения.

In [26]: a = np.random.random((3, 4))

In [27]: b = np.random.random((3, 4))

In [28]: np.cross(a, b, axisa=0, axisb=0)
Out[28]: 
array([[-0.34780508,  0.54583745, -0.25644455],
       [ 0.03892861,  0.18446659, -0.36877085],
       [ 0.36736545,  0.13549752, -0.32647531],
       [-0.46253185,  0.56148668, -0.10056834]])

вы должны создать a и b следующим образом:

a = sc.array([1, 2, 3])
b = sc.array([4, 5, 6])

Так что они имеют размерность = 3.