Matplotlib绘制numpy.matrix类型的奇怪行为

时间:2017-02-26 23:09:55

标签: 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)

verts = verts_small[:, ::1000]

ax.plot(verts[0, :], verts[1, :], verts[2, :], 'o')

这有奇怪的行为。将点全部绘制成一条线。

如果相反:

verts = np.array(verts[:, ::1000])

3D图可以按预期工作。这是一个预期的行为还是一个错误?

1 个答案:

答案 0 :(得分:1)

正如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_m甚至不像列表一样:

>>> len(verts[0])
1
>>> len(verts[0][0])
1
>>> len(verts[0][0][0][0][0][0][0][0][0][0])
1

实质上,np.matrix在涉及numpy操作时打破了大多数关于形状的规则。要在matplotlib中支持它,他们要么需要刻意解决这些规则中断,要么强制输入为标准np.array