NumPy中矢量的交叉产物

Ing*_*ngo 11 python numpy

考虑以下向量(基本上是2x1矩阵):

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

b = sc.array([[4], [5], [6]])
>>> b
[[4]
 [5]
 [6]]
Run Code Online (Sandbox Code Playgroud)

可以使用计算这些载体的叉积numpy.cross().为什么这不起作用:

import numpy as np 

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

但是这样做了吗?

np.cross(a.T, b.T)
[[-3  6 -3]]
Run Code Online (Sandbox Code Playgroud)

tal*_*ies 17

要使用计算交叉积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)
Run Code Online (Sandbox Code Playgroud)

最后一个轴的长度仅为1,因此未定义叉积.但是,如果使用转置,则沿最后一个轴的长度为3,因此它是有效的.你也可以这样做:

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

cross表示矢量是沿第一轴定义的,而不是最后一个轴.

  • @thomas:据我所知,情况并非如此。但是,在定义向量时遵循库的约定,或者显式定义它们的调用顺序,真的是一项艰巨的任务吗? (2认同)
  • 当然,您可以只定义一个包装器. (2认同)

Bi *_*ico 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
Run Code Online (Sandbox Code Playgroud)

您可以将向量存储为二维数组,当您有一组想要以类似方式处理的向量时,这是最有用的。例如,如果我想将 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]])
Run Code Online (Sandbox Code Playgroud)

  • 巴戈在这里提出了这一点。Numpy 不是 MATLAB,您可以(并且应该)忘记列和行,因为数组是一个计算概念并且没有它。矩阵可以。 (3认同)