numpy 2D @ 1D matmul结果中的问题

时间:2019-06-20 10:40:43

标签: python arrays numpy matrix

我正在尝试使用2x2矩阵P和坐标internal(以np.array的形式存储在numpy中旋转一些坐标)。但是,在计算P @ internal时出现奇怪的行为。下面的代码重现了该行为:

>>> import numpy as np
>>> a = np.array([1, 0], dtype=np.float)
>>> c, s = np.cos(np.pi), np.sin(np.pi)
>>> p = np.matrix([[c, s], [-s, c]])
>>> b = p @ a
>>> b
matrix([[-1.0000000e+00, -1.2246468e-16]])
>>> b.shape
(1, 2)
>>> b[0].shape
(1, 2)
>>> b[0][0].shape
(1, 2)
>>> b[0][0][0].shape
(1, 2)

可以看出,我无法索引到矩阵中,并且突然间我应该在1D数组中有了一个额外的维度。在the documentation for numpy中,其声明“如果第二个自变量是1-D,则通过在其维上附加1来将其提升为矩阵。在矩阵相乘后,将删除附加的1。”但是,我没有看到这种现象,而是看到了奇怪的嵌套形状。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

正如您所指出的,bmatrix。这是ndarray弃用的子类,它总是 2D 。初始化具有(N,)元素向量的矩阵,将1附加到形状上,然后按预期将其变成(N, 1)列。 b[0]也是一个矩阵,但是这次是一行。该行的第一行也是一行,因此无论您访问第一行多少次,形状都将保持不变。

话虽如此,您可以使用行列索引访问单个矩阵元素:

>>> b[0, 0]
-1.0

TL; DR

请勿使用matrix:不推荐使用,并且存在问题/缺乏支持。改为使用p = np.array([[c, s], [-s, c]]),您将看到预期的行为。