2012-09-13 9 views
9

Ok, ich habe also das Gefühl, dass es einen einfachen Weg geben sollte, ein 3D-Streudiagramm mit Matplotlib zu erstellen. Ich habe ein 3D numpy Array (dset) mit 0, wo ich will keinen Punkt und 1, wo ich tun, im Grunde ist es plotten ich jetzt durch drei for: Schleifen als solche Schritt müssen:Erstellen eines 3D-Plots aus einem 3D-Numpy-Array

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') 

Irgendwelche Vorschläge Wie könnte ich das effizienter erreichen? Irgendwelche Ideen würden sehr geschätzt werden.

Antwort

14

Wenn Sie eine dset so haben, und Sie wollen einfach nur die 1 Werte erhalten, könnten Sie nonzero, die „ein Tupel von Arrays zurückgibt, eine für jede Dimension der a, die Indizes der Nicht-Null enthält, Elemente in dieser Dimension. ".

Zum Beispiel können wir eine einfache 3D-Array machen:

>>> 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]]]) 

und finden, wo die Nicht-Null-Elemente befinden sich:

>>> 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() 

Wenn wir einen komplizierteren Schnitt wollten, könnten wir es getan haben etwas wie (d > 3.4).nonzero() oder so etwas wie True hat einen ganzzahligen Wert von 1 und zählt als nicht Null.

Schließlich haben wir plotten:

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") 

geben

demo 3d image

+0

Schöne. Ich habe eine Frage über den '(d> 3.4) .nonzero()' Teil obwohl, würde das nur die Orte zurückgeben, wo d einen Wert größer als 3.4 hat? – pter

+0

@pter: genau richtig. '(d> 3.4)' gibt einem booleschen Array die gleiche Form wie 'd' mit' True', wobei der Eintrag anderswo> 3.4 und 'False' ist. – DSM

+0

süß ich wusste nicht darüber (in der Regel brauchen 3D-Plots ... aber wenn ich das tue, wäre es super!) Danke DSM –

Verwandte Themen