numpy - 在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]]

时间:

使用numpy.cross计算交叉积,定义两个向量的数组维数的维度(长度)必须由两个或三个向量组成,引用文档:

如果ab是矢量阵列,那么这个向量由ab的最后一轴定义,这些轴可以是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向量是沿着第一个轴定义的,而不是最后一个轴。

我们常常使用1维数组来表示矢量,并将它视为行矢量或列矢量,例如:


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

你可以将矢量存储为2维数组,当你有一个要以类似方式处理的矢量集合时,这最有用。例如,如果我想将a中的4个向量与b中的4个向量交叉,默认情况下,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.

...