Python Matplotlib打印numpy.matrix类型的奇怪行为
我有一些用Python Matplotlib打印numpy.matrix类型的奇怪行为,python,numpy,matrix,matplotlib,Python,Numpy,Matrix,Matplotlib,我有一些用numpy.matrix类型进行计算的结果 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) # [...] # Downsampling for plotting # type(verts): np.matrix # verts.shape: (3, 700000) v
numpy.matrix
类型进行计算的结果
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
# [...]
# Downsampling for plotting
# type(verts): np.matrix
# verts.shape: (3, 700000)
verts = verts_small[:, ::1000]
ax.plot(verts[0, :], verts[1, :], verts[2, :], 'o')
这有奇怪的行为。将所有点绘制成一条直线
如果相反:
verts = np.array(verts[:, ::1000])
3D绘图按预期工作。这是一个预期的行为还是一个bug?正如hpaulj所提到的,这里的问题是结果是2d:
>>> verts = np.zeros((3, 100))
>>> verts_m = np.matrix(verts)
>>> verts[0, :].shape
(100,)
>>> verts_m[0, :].shape
(1, 100)
至关重要的是,这会破坏任何希望能够在2d数组的列或行上迭代的代码:
>>> len(verts)
100
>>> len(verts_m)
1
更糟糕的是,verts\u m
甚至不能作为列表列表:
>>> len(verts[0])
1
>>> len(verts[0][0])
1
>>> len(verts[0][0][0][0][0][0][0][0][0][0])
1
本质上,当涉及到numpy操作时,
np.matrix
打破了大多数关于形状的规则。要在matplotlib
中支持它,他们需要故意绕过这些规则中断,或者强制输入为标准np.array
s.请记住,当索引np.matrix
时,结果仍然是2d。np.ndarray
可能是1d(取决于你的索引方式)。“np.matrix的奇怪行为一般来说并不奇怪。编写处理np.matrix的代码很困难,因为它无法转换为一维数组。有人说在immintent版本中不推荐np.matrix
,但我们还没有做到。无论如何,我强烈建议不要使用它。“把一切都当作一个矩阵”思维的问题是,现在每个数字列表都可以是水平的或垂直的,所有的东西都需要处理这个问题。我认为真正的问题是,np.matrix
捆绑了一个半有用的特性,*
总是意味着np.dot
,非常令人沮丧的是,一切都是2dIMO,一些矩阵。重塑((2,1,3,1))。形状!=(2,1,3,1)
完全正确evil@hpaulij是的,谢谢。在文档上看到了这一点。:)@埃里克:古典数学已经是这样了。向量是列向量(所以是垂直的)。在这个假设下,只要使用矩阵乘法的定义,就很容易做任何事情。(例如,标量积v.T*u
、范数v.T*v
、线性运算符A*v
、矩阵x矩阵A*B
。一切都是完美的。:)。但我相信这是一个意见的问题,也许有些应用程序不需要这样做。谢谢你们富有成果的讨论。