2017-02-26 177 views
2

我有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

你看过':: 1000'索引后'verts'的形状吗?如果您从2d数组开始,则需要确保您正确编制了正确的维度。在较小的东西上练习那种索引,让你明白其中的差异。 – hpaulj

+0

@hpaulj在我纠正的第一个电话中有一个错字。顺便说一下,我在切片后获得的形状对于'np.array'和'np.matrix'类型都是相同的。 – SolidSnake

+2

请记住,当您索引'np.matrix'时,结果仍然是2d。 'np.ndarray'可能是1d(取决于你如何编制索引)。 – hpaulj

回答

1

由于hpaulj提到,这里的问题是,结果是2D:

>>> verts = np.zeros((3, 100)) 
>>> verts_m = np.matrix(verts) 
>>> verts[0, :].shape 
(100,) 
>>> verts_m[0, :].shape 
(1, 100) 

关键的是,这打破了希望能够遍历一个二维数组的列或行的任何代码:

>>> 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 s。