2012-09-13 24 views
9

Ok, así que creo que debería haber una manera fácil de crear un trazado de dispersión tridimensional utilizando matplotlib. Tengo una matriz 3D numpy (dset) con 0 de donde yo no quiero un punto y de 1, donde yo, básicamente para trazar ahora tengo que pasar por tres for: bucles como por ejemplo:Crear un trazado 3D a partir de un conjunto 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') 

Cualquier sugerencia sobre cómo podría lograr esto de manera más eficiente? Cualquier idea sería muy apreciada.

Respuesta

14

Si usted tiene un dset así, y desea obtener sólo los 1 valores, se puede usar nonzero, que "devuelve una tupla de matrices, una para cada dimensión de a, que contiene los índices de la no-cero elementos en esa dimensión ".

Por ejemplo, podemos hacer una matriz simple 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]]]) 

y encontrar donde se encuentran los elementos no nulos:

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

Si quisiéramos un corte más complicado, que podría haber hecho algo así como (d > 3.4).nonzero() o algo así, ya que True tiene un valor entero de 1 y cuenta como distinto de cero.

Por último, trazamos:

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

dando

demo 3d image

+0

Hermosa. Tengo una pregunta sobre la parte '(d> 3.4) .nonzero()', ¿eso devolvería solo los lugares donde d tiene un valor mayor a 3.4? – pter

+0

@pter: exactamente correcto. '(d> 3.4)' da a una matriz booleana la misma forma que 'd' con' True' donde la entrada es> 3.4 y 'False' en otro lugar. – DSM

+0

dulce No sabía de esto (generalmente no necesito tramas en 3D ... pero si lo hago será increíble!) Gracias DSM –

Cuestiones relacionadas