Ich habe ein großes Numpy-Array, das ich bearbeiten muss, damit jedes Element entweder auf 1 oder 0 geändert wird, wenn eine Bedingung erfüllt ist (wird später als Pixelmaske verwendet). Das Array enthält ungefähr 8 Millionen Elemente, und meine derzeitige Methode dauert zu lange für die Reduktionspipeline:
for (y,x), value in numpy.ndenumerate(mask_data):
if mask_data[y,x]<3: #Good Pixel
mask_data[y,x]=1
elif mask_data[y,x]>3: #Bad Pixel
mask_data[y,x]=0
Gibt es eine Numpy-Funktion, die dies beschleunigen würde?
python
arrays
numpy
conditional
ChrisFro
quelle
quelle
mask_data[y,x]==3
?if mask_data[y,x]>=3:
Antworten:
Sie können dies verkürzen mit:
quelle
Siehe z. B. Indizieren mit booleschen Arrays .
quelle
a[a > 3] = -101+a[a > 3]
.a[a > 3] = -101+a[a > 3]
werdena[a > 3] += -101
Sie höchstwahrscheinlich mit einem Speicherverlust konfrontiert sein.Der schnellste (und flexibelste) Weg ist die Verwendung von np.where , bei dem zwischen zwei Arrays gemäß einer Maske (Array von wahren und falschen Werten) gewählt wird:
was produzieren wird:
quelle
a[a<3] = 0
Sie können Ihr Maskenarray in einem Schritt wie folgt erstellen
Dadurch wird ein boolesches Array erstellt, das dann als Pixelmaske verwendet werden kann. Beachten Sie, dass wir das Eingabearray nicht geändert haben (wie in Ihrem Code), sondern ein neues Array erstellt haben, das die Maskendaten enthält. Ich würde empfehlen, dies auf diese Weise zu tun.
quelle
.astype(int)
oder verwenden*1
, aber ein Array vonTrue
undFalse
ist genauso gut wie es ist.Ich bin nicht sicher, ob ich Ihre Frage verstanden habe, aber wenn Sie schreiben:
Dadurch werden alle Werte von Maskendaten, deren x- und y-Index kleiner als 3 ist, gleich 1 und alle übrigen gleich 0
quelle