考虑以下向量(基本上是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]]
答案 0 :(得分:16)
要使用numpy.cross
计算叉积,定义两个向量的数组维度的维度(长度)必须为2或3。引用文档:
如果
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
向量是沿第一个轴而不是最后一个轴定义的。
答案 1 :(得分:4)
在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数组,当您想要以类似方式处理的矢量集合时,这非常有用。例如,如果我想在b中的4个向量中交叉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]])
答案 2 :(得分:1)
你应该像这样创建一个和b:
a = sc.array([1, 2, 3])
b = sc.array([4, 5, 6])
这样他们就有了维度= 3。