2013-10-29 11 views
5

Ho una matrice che assomiglia:matplotlib: array NumPy Plot con Nessuno come valori

k = numpy.array([(1.,0.001), (1.1, 0.002), (None, None), 
       (1.2, 0.003), (0.99, 0.004)]) 

voglio tracciare i valori che non sono (None, None) e mantenere l'indice del valore di matrice. Cioè, voglio un divario ovunque ci sia un valore (None, None).

Quando ciò è fatto vorrei tracciare

y = k[:,0] + k[:,1] 

ma non posso anche aggiungere gli array insieme. Ho provato a mascherare l'array, ma ho perso i valori dell'indice dell'array originale .

Un esempio minimo:

import matplotlib.pyplot as pyplot 
import numpy 

x = range(5) 
k = numpy.array([(1.,0.001), (1.1, 0.002), (None, None), 
       (1.2, 0.003), (0.99, 0.004)]) 

Fig, ax = pyplot.subplots() 

# This plots a gap---as desired 
ax.plot(x, k[:,0], 'k-') 

# I'd like to plot 
#  k[:,0] + k[:,1] 
# but I can't add None 

# Here I get rid of the (None, None) values so I can add 
# But I lose the original indexing 
mask = k != (None, None) 
y = k[mask].reshape((-1,2)) 

ax.plot(range(len(y)), y[:,0]+y[:,1], 'k--') 

risposta

3

È possibile utilizzare numpy.nan invece di None.

import matplotlib.pyplot as pyplot 
import numpy 

x = range(5) 
k = numpy.array([(1.,0.001), (1.1, 0.002), (numpy.nan, numpy.nan), 
       (1.2, 0.003), (0.99, 0.004)]) 

Fig, ax = pyplot.subplots() 

# This plots a gap---as desired 
ax.plot(x, k[:,0], 'k-') 

ax.plot(range(len(y)), y[:,0]+y[:,1], 'k--') 

Oppure si potrebbe mascherare il valore x e, in modo gli indici sono stati coerenti tra xey

import matplotlib.pyplot as pyplot 
import numpy 

x = range(5) 
y = numpy.array([(1.,0.001), (1.1, 0.002), (numpy.nan, numpy.nan), 
       (1.2, 0.003), (0.99, 0.004)]) 

Fig, ax = pyplot.subplots() 


ax.plot(range(len(y)), y[:,0]+y[:,1], 'k--') 
import matplotlib.pyplot as pyplot 
import numpy 

x = range(5) 
k = numpy.array([(1.,0.001), (1.1, 0.002), (None, None), 
       (1.2, 0.003), (0.99, 0.004)]) 

Fig, ax = pyplot.subplots() 

# This plots a gap---as desired 
ax.plot(x, k[:,0], 'k-') 

# I'd like to plot 
#  k[:,0] + k[:,1] 
# but I can't add None 

arr_none = np.array([None]) 
mask = (k[:,0] == arr_none) | (k[:,1] == arr_none) 

ax.plot(numpy.arange(len(y))[mask], k[mask,0]+k[mask,1], 'k--') 
+0

Potrei per questo semplice esempio, ma ottengo i miei dati da un'altra fonte quindi non posso controllarlo. – jlconlin

+0

e non puoi sostituire la trama? Potresti fare quello che stai facendo, ma mascherare il valore x anche nella trama? –

+0

Questo ha funzionato quasi. Quando crei la maschera devi rendere 'None' un array come la risposta di Saullo. – jlconlin

1

È possibile filtrare ti matrice fare:

test = np.array([None]) 
k = k[k!=test].reshape(-1, 2).astype(float) 

E poi sum su le colonne e fare la trama. Il problema del tuo approccio è che non hai convertito il tipo None in una matrice numpy, che non consentiva la corretta creazione della maschera.