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
。一切都是完美的。:)。但我相信这是一个意见的问题,也许有些应用程序不需要这样做。谢谢你们富有成果的讨论。