2017-12-14 5 views
0

Ich möchte eine Bedingung innerhalb eines Arrays überprüfen und eine Operation an der Position ausführen, an der die Bedingung erfüllt ist. Zum Beispiel hat dieses Stück Code, um den Job:Prüfen auf einen Zustand innerhalb eines Arrays

res = somefunction(x) 
for i in range(x.shape[0]): 
    for j in range(x.shape[1]): 
     if not 6 < res[i,j] < 18: 
      x[i,j] = float('nan') 

Aber ich dachte, ein schneller (und kürzerer) Weg, vielleicht so etwas wie sein würde:

x[not 6 < somefunction(x) < 18] = float('nan') 

Aber Python gibt den Fehler, dass diese Bedingung überprüft funktioniert nicht im Array mit mehr als Element. Gibt es eine Möglichkeit, meinen Code schneller zu machen?

+0

'x [~ ((6 < x) & (x <18))] = np.nan' kann funktionieren? –

Antwort

1

Sie können not oder verkettete Vergleiche mit Arrays nicht verwenden, da weder not noch verkettete Vergleiche zum Broadcasting implementiert werden können.

Split die verkettete Vergleich in zwei Vergleiche, und verwenden Sie ~ und & statt not und and, da NumPy die Bit-Operatoren für Boolesche Operationen auf boolean Arrays verwendet:

x[~((6 < res) & (res < 18))] = numpy.nan 
+0

Okay, habe das nicht gesehen, als ich gepostet habe. Wird Entfernen. –

+0

Sie sollten auch angeben, dass 'x' entweder float oder object sein sollte, damit dies funktioniert. –

Verwandte Themen