2010-08-31 18 views
12

In Numpy 1.4.1, qual è il modo più semplice o più efficiente di calcolare l'istogramma di mascherato matrice ? numpy.histogram e pyplot.hist contiamo gli elementi mascherati, per impostazione predefinita!Come creare l'istogramma di una matrice con valori mascherati, in Numpy?

L'unica soluzione semplice che posso pensare al momento comporta la creazione di un nuovo array con il valore non mascherato:

histogram(m_arr[~m_arr.mask]) 

Questo non è molto efficiente, anche se, come questo crea inutilmente un nuovo array. Sarei felice di leggere su idee migliori!

+1

Per quello che vale, questo sarebbe probabilmente considerato un bug in 'numpy.histogram'. Probabilmente dovresti presentare un bug report e menzionarlo nella mailing list. È facilmente risolvibile sostituendo 'asarray' con' asanyarray' nelle fonti 'numpy.histogram'. –

+0

Joe, potresti voler inviare il tuo commento come risposta: potrei contrassegnarlo come risposta accettata, se confermata dagli sviluppatori di Numpy. – EOL

+2

Ho inviato una breve domanda alla lista. http://mail.scipy.org/pipermail/numpy-discussion/2010-Settembre/052575.html Vedremo se la gente lo considera un bug o meno. Mi sembra per nulla intuitivo, comunque. –

risposta

13

(Ripristino di questo come da discussione di cui sopra ...)

non sono sicuro se gli sviluppatori NumPy considererebbero questo un bug o comportamento previsto. I asked on the mailing list, quindi immagino vedremo cosa dicono.

In entrambi i casi, è una soluzione semplice. Patch numpy/lib/function_base.py utilizzare numpy.asanyarray anziché numpy.asarray sugli ingressi alla funzione le consentirà utilizzare correttamente array mascherati (o qualsiasi altra sottoclasse di un ndarray) senza creare una copia.

Modifica: Sembra che sia previsto un comportamento. As discussed here:

Se si desidera ignorare i dati mascherato è solo sulla chiamata di funzione in più

istogramma (m_arr.compressed())

Io non credo che il fatto che questo rende un la copia in più sarà rilevante, perché suppongo che la manipolazione dell'intero array mascherato all'interno dell'istogramma sia un lotto molto più costoso.

Uso asanyarray consentirebbe anche matrici in altri sottotipi e che non potrebbe essere gestita correttamente dai calcoli istogramma.

Per altro oltre cadere osservazioni mascherati, sarebbe necessario capire cosa mascherato definizione del campo di un istogramma è, come Bruce sottolineato.

+0

Grazie. Uno degli argomenti contro la gestione degli array mascherati negli istogrammi è che se gli istogrammi gestiscono valori mascherati, si dovrebbe decidere come trattare i dati mascherati con una matrice mascherata di pesi. Non penso che ci sia una soluzione ovviamente migliore a questo problema: sembra che le caratteristiche di 'histogram()' non si mescolino troppo bene con input mascherati + matrici di pesi. – EOL

7

Prova hist(m_arr.compressed()).

+1

Questa è un'idea migliore del mio 'm_arr [~ m_arr.mask]'. Tuttavia, non risolve il problema che un nuovo array viene corretto senza necessità. – EOL

+0

PS: "corretto" -> "creato" – EOL

2

Questa è una domanda super vecchio, ma questi giorni basta usare:

numpy.histogram(m_arr, bins=.., range=.., density=False, weights=m_arr_mask)

Dove m_arr_mask è un array con la stessa forma m_arr, costituito da 0 valori per gli elementi di m_arr a essere escluso dall'istogramma e 1 valori per gli elementi che devono essere inclusi.

+0

Quanto funziona per i NaN? –

+0

Inoltre, questo non funzionerà se si tenta di passare una stringa per 'bins'. Ottima risposta a parte questo. –

Problemi correlati