numpy 2D@1D matmul resu发行

2024-04-16 10:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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被移除。“然而,我没有看到这种行为,而只是看到奇怪的嵌套形状。你知道吗

为什么会这样?你知道吗


Tags: 代码importnumpyasnppi矩阵cos
1条回答
网友
1楼 · 发布于 2024-04-16 10:26:50

正如你指出的,b是一个^{}。这是^{}的一个弃用子类,它总是2D。用(N,)元素向量初始化矩阵会将1附加到形状,并将其变成(N, 1)列,如预期的那样。b[0]也是一个矩阵,但这次它是一行。行的第一行也是一行,因此无论访问第一行多少次,形状都将保持不变。你知道吗

也就是说,您可以使用行-列索引访问各个矩阵元素:

>>> b[0, 0]
-1.0

TL;DR

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

相关问题 更多 >