numpy 2D @ 1D 矩阵结果中的问题



我正在尝试使用 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)
可以看出,我

无法索引到矩阵中,并且我突然在应该是一维数组中增加了一个维度。在 numpy 的文档中,它指出"如果第二个参数是 1-D,则通过在其维度上附加 1 将其提升为矩阵。矩阵乘法后,附加的 1 被删除。但是,我没有看到这种行为,而只是看到了奇怪的嵌套形状。

为什么会这样?

正如你所指出的,b是一个matrix.这是 ndarray 的一个已弃用的子类,它始终是 2D。使用 (N,) 元素向量初始化矩阵会将 1 附加到形状,将其转换为(N, 1)列,如预期的那样。 b[0]也是一个矩阵,但这次是一行。该行的第一行也是一行,因此无论您访问第一行多少次,形状都将保持不变。

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

>>> b[0, 0]
-1.0

博士

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

最新更新