2012-09-13 12 views
9

これで、matplotlibを使って3次元散布図を作成する簡単な方法があるはずです。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') 

任意の提案:私は、基本的に今それをプロットするために、私のような3つのfor:のループをステップ実行しなければならないのポイントと1のを望んでいない0で3D numpyの配列(dset)を持っていますどのように私はこれをより効率的に達成することができましたか?どんなアイデアでも大歓迎です。

答えて

14

あなたがそのようなdsetを持っており、あなただけの1値を取得したい場合は、ゼロ以外のインデックスを含む、aの各次元のために、「配列のタプルを返しnonzero、1を使用することができますその次元の要素。 "例えば

、我々は簡単な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'と同じ形を与え、' True'でエントリが3.4より大きい場合は 'False'を返します。 – DSM

+0

甘い私はこれについて知りませんでした(通常は3dプロットが必要です...しかし、もしこれが素晴らしいのです!)thanks DSM –

関連する問題