2017-02-26 223 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。