2012-09-13 75 views
9

好的,所以我覺得應該有一個簡單的方法來使用matplotlib創建三維散點圖。我有一個3D numpy的陣列(dset)0的,我不想點和1的,我呢,基本上現在繪製它,我要踩通過三個for:環這樣:從3D numpy陣列創建3D圖形

for i in range(30): 
    for x in range(60): 
     for y in range(60): 
      if dset[i, x, y] == 1: 
       ax.scatter(x, y, -i, zdir='z', c= 'red') 

任何建議關於如何更有效地完成這項工作?任何想法將不勝感激。

回答

14

如果你有一個dset這樣,和你想只得到1值,你可以使用nonzero,其中「返回數組的一個元組,一個爲a每個維度,包含非零的索引該維度中的元素。「

例如,我們可以做一個簡單的3D陣列:

>>> import numpy 
>>> numpy.random.seed(29) 
>>> d = numpy.random.randint(0, 2, size=(3,3,3)) 
>>> d 
array([[[1, 1, 0], 
     [1, 0, 0], 
     [0, 1, 1]], 

     [[0, 1, 1], 
     [1, 0, 0], 
     [0, 1, 1]], 

     [[1, 1, 0], 
     [0, 1, 0], 
     [0, 0, 1]]]) 

,並找到其中的非零元素位於:

>>> d.nonzero() 
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 0, 1, 2, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2]), array([0, 1, 0, 1, 2, 1, 2, 0, 1, 2, 0, 1, 1, 2])) 
>>> z,x,y = d.nonzero() 

如果我們想要一個更復雜的剪裁,我們可以做像(d > 3.4).nonzero()之類的東西,因爲True的整數值爲1並且計數爲非零。

最後,我們繪製:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(x, y, -z, zdir='z', c= 'red') 
plt.savefig("demo.png") 

demo 3d image

+0

美麗。我有一個關於'(d> 3.4).nonzero()'部分的問題,那隻會返回d的值大於3.4的地方嗎? – pter

+0

@pter:完全正確。 '(d> 3.4)'給出一個布爾數組,其形式與''d'具有相同的形狀,其中在其他地方入口> 3.4和'False'。 – DSM

+0

甜蜜我不知道這件事(通常不需要3D地塊......但如果我這樣做會很棒!)感謝帝斯曼 –