我得到了使用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图可以按预期工作。这是一个预期的行为还是一个错误?
答案 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
。