我正在尝试使用 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]])
,您将看到预期的行为。