2017-07-04 3 views
1

Gibt es eine Möglichkeit zu vermeiden, bestimmte Werte zu verwenden, wenn Sie Summe und Mittelwert in numpy anwenden?Wie ignoriert man Werte bei Verwendung von numpy.sum und numpy.mean in Matrizen

Ich möchte zum Beispiel den Wert -999 bei der Berechnung des Ergebnisses vermeiden.

In [14]: c = np.matrix([[4., 2.],[4., 1.]]) 

In [15]: d = np.matrix([[3., 2.],[4., -999.]]) 

In [16]: np.sum([c, d], axis=0) 
Out[16]: 
array([[ 7., 4.], 
     [ 8., -998.]]) 

In [17]: np.mean([c, d], axis=0) 
Out[17]: 
array([[ 3.5, 2. ], 
     [ 4. , -499. ]]) 
+2

Haben Sie versucht, Verwenden einer Maske mit Nullwerten, wobei Werte = -xxx? –

+0

Welche Werte möchten Sie in '[1,1]' Ecke, anstelle des großen Negativs? '1',' maskiert', 'nan', etwas anderes? – hpaulj

Antwort

3

Eine Möglichkeit ist, den spezifischen Wert mit np.nan und verwenden Sie dann numpy.nansum und numpy.nanmean wie kommentiert von @sk zu ersetzen:

import numpy as np 
def nan_if(arr, value): 
    return np.where(arr == value, np.nan, arr) 

np.nansum([nan_if(c, -999), nan_if(d, -999)], axis=0) 
#array([[ 7., 4.], 
#  [ 8., 1.]]) 

np.nanmean([nan_if(c, -999), nan_if(d, -999)], axis=0) 
#array([[ 3.5, 2. ], 
#  [ 4. , 1. ]]) 
+1

Ich war interessiert zu finden, dass ['numpy.ma'] (https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html#constructing-masked-arrays) schien hier keinen Nutzen zu haben. Zum Beispiel, 'np.sum ((ma.masked_values ​​(c, -999), ma.masked_values ​​(d, -999)), axis = 1)' gibt nicht die gewünschte Ausgabe ... –

+1

@BradSolomon: use ' np.ma.sum' – Eric

+0

@Eric gute finden, sah ich, aber dachte nicht, dass es elementweise berechnet –

4

Verwenden Sie eine maskierte Array:

>>> c = np.ma.array([[4., 2.], [4., 1.]]) 
>>> d = np.ma.masked_values([[3., 2.], [4., -999]], -999) 

>>> np.ma.array([c, d]).sum(axis=0) 
masked_array(data = 
[[7.0 4.0] 
[8.0 1.0]], 
      mask = 
[[False False] 
[False False]], 
     fill_value = 1e+20) 

>>> np.ma.array([c, d]).mean(axis=0) 
masked_array(data = 
[[3.5 2.0] 
[4.0 1.0]], 
      mask = 
[[False False] 
[False False]], 
     fill_value = 1e+20) 
+0

Um das resultierende Array erhalten können Sie '.data' Attribut –

+0

Oder besser,' .Filled (0) 'oder verwenden 'filled (np.nan)', falls eine ganze Zeile '-999' ist – Eric

+0

Viele der' np.ma' Funktionen/Methoden benutzen 'filled (something_innocous)' um neue Werte zu berechnen. Entweder das oder "komprimiert", um die maskierten Werte zu entfernen. – hpaulj

Verwandte Themen