2012-09-13 20 views
9

Ok, więc wydaje mi się, że powinien istnieć łatwy sposób utworzenia 3-wymiarowego wykresu rozrzutu za pomocą matplotlib. Mam 3D numpy array (dset) z 0 na którym nie ma punktu, a 1 jest gdzie ja, w zasadzie do wykreślenia go teraz muszę przejść przez trzy for: pętli jako takie:Tworzenie wykresu 3D z tablicy 3D numpy

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

Wszelkie sugestie o tym, jak mogłem to zrobić bardziej efektywnie? Wszelkie pomysły będą mile widziane.

Odpowiedz

14

Jeśli masz dset takiego, i chcesz po prostu uzyskać wartości 1, można użyć nonzero, który „zwraca krotki tablic, po jednej dla każdego wymiaru a zawierający indeksy niezerowych elementy w tym wymiarze. ".

Na przykład, możemy zrobić prosty 3d tablicy:

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

i dowiedzieć, gdzie znajdują się niezerowe elementy:

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

Gdybyśmy chcieli bardziej skomplikowanego cięcia, mogliśmy zrobić coś takiego jak (d > 3.4).nonzero() lub coś takiego, ponieważ True ma wartość całkowitą 1 i liczy się jako niezerowe.

Wreszcie możemy wykreślić:

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

dając

demo 3d image

+0

piękne. Mam pytanie dotyczące części '(d> 3.4) .nonzero()', czy zwrócą one tylko te miejsca, w których d ma wartość większą niż 3.4? – pter

+0

@pter: dokładnie w prawo. '(d> 3.4)' daje tablicy boolowskiej taki sam kształt jak 'd' z' True', gdzie pozycja jest> 3.4 i 'False' gdzie indziej. – DSM

+0

słodki Nie wiedziałem o tym (zwykle nie potrzebuję działek 3D ... ale jeśli to zrobię, będzie niesamowite!) Dzięki DSM –