NumPy中向量的叉积

16 投票
3 回答
48660 浏览
提问于 2025-04-17 12:54

考虑以下向量(实际上是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 个回答

1

你应该像这样创建 a 和 b:

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

这样它们的维度就是 3。

5

在numpy中,我们经常用一维数组来表示向量,根据不同的情况,我们可以把它当作行向量或者列向量。例如:

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

你也可以把向量存储为二维数组,这在你有一组想要以相似方式处理的向量时特别有用。比如说,如果我想把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]])
25

要使用 numpy.cross 计算叉乘,定义两个向量的数组的维度(长度)必须是2或3。根据文档的说明:

如果 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 函数,向量是沿着第一个轴来定义的,而不是最后一个轴。

撰写回答