2012-09-13 216 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地块......但如果我这样做会很棒!)感谢帝斯曼 –