Ich versuche, eine elementweise Teilung in Python durchzuführen, aber wenn eine Null angetroffen wird, muss der Quotient nur Null sein.
Beispielsweise:
array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])
array1 / array2 # should be np.array([0, 1, 2])
Ich könnte immer nur eine for-Schleife durch meine Daten verwenden, aber um die Optimierungen von numpy wirklich zu nutzen, muss die Divide-Funktion 0 bei Fehlern durch Division durch Null zurückgeben, anstatt den Fehler zu ignorieren.
Wenn mir nichts fehlt, scheint es nicht so, als ob numpy.seterr () bei Fehlern Werte zurückgeben kann. Hat jemand andere Vorschläge, wie ich das Beste aus Numpy herausholen kann, während ich meine eigene Division durch Null-Fehlerbehandlung setze?
python
arrays
numpy
error-handling
divide-by-zero
hlin117
quelle
quelle
Antworten:
In numpy v1.7 + können Sie die Option "where" für ufuncs nutzen . Sie können Dinge in einer Zeile erledigen und müssen sich nicht mit dem fehlerhaften Kontextmanager befassen.
In diesem Fall wird die Divisionsberechnung überall dort durchgeführt, wo 'b nicht gleich Null ist. Wenn b gleich Null ist, bleibt es unverändert gegenüber dem Wert, den Sie ursprünglich im Argument 'out' angegeben haben.
quelle
a
und / oderb
ganzzahlige Arrays sein könnten, dann ist es das gleiche Konzept, Sie müssen nur explizit den richtigen Ausgabetypc = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
out=np.zeros_like(a)
ist kritisch, wie in der kommentierten Zeile angegeben.np.divide(a, b, out=np.zeros_like(a), where=b!=0)
, bekomme ich den FehlerAssigning to function call which doesn't return
. Das Seltsame ist, ich benutze es zweimal und der Fehler tritt nur einmal auf.Aufbauend auf der Antwort von @Franck Dernoncourt, die -1/0 korrigiert:
quelle
~
invertiertTrue
undFalse
in numpy Arrays :print ~ np.array([ True, False, False ])
.c[ ~ np.isfinite( c )] = 0
bedeutet: Finden Sie die Positionen, an denenc
es endlich ist, invertieren Sie die Positionen , mit denen sie NICHT endlich sind~
, und setzen Sie die nicht-endlichen Werte auf 0. Siehe auch stackoverflow.com/search?q=[numpy‹+"boolean+indexing "Aufbauend auf den anderen Antworten und Verbesserung auf:
0/0
Handhabung durch Hinzufügeninvalid='ignore'
zunumpy.errstate()
numpy.nan_to_num()
konvertierennp.nan
zu0
.Code:
Ausgabe:
quelle
0/0
sowie1/0
Fehler.a
oderb
enthältNaN
, gibt Ihre Lösung plötzlich0
als Ergebnis. Dies kann Fehler in Ihrem Code leicht verbergen und ist absolut unerwartet.numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
ist die Unterschrift.Einzeiler (wirft Warnung)
quelle
Versuchen Sie es in zwei Schritten. Zuerst teilen, dann ersetzen.
Die
numpy.errstate
Zeile ist optional und verhindert nur, dass Numpy Sie über den "Fehler" der Division durch Null informiert, da Sie dies bereits beabsichtigen und diesen Fall behandeln.quelle
np.errstate(divide='ignore'):
divide='warn'
könnte auch nützlich sein, wenn er / sie noch benachrichtigt werden möchte.Sie können auch basierend auf ersetzen
inf
, nur wenn die Array-d-Typen gemäß dieser Antwort Floats sind :quelle
Eine Antwort, die ich bei der Suche nach einer verwandten Frage gefunden habe, war die Manipulation der Ausgabe basierend darauf, ob der Nenner Null war oder nicht.
Angenommen
arrayA
undarrayB
initialisiert wurde, sondernarrayB
hat einige Nullen. Wir könnten Folgendes tun, wenn wirarrayC = arrayA / arrayB
sicher rechnen wollen .In diesem Fall setze ich die Zelle immer dann, wenn ich in einer der Zellen eine Division durch Null habe, auf gleich
myOwnValue
, was in diesem Fall Null wäreFußnote: Rückblickend ist diese Zeile sowieso nicht erforderlich, da sie
arrayC[i]
auf Null instanziiert wird. Aber wenn das der Fall wäremyOwnValue != 0
wäre, würde diese Operation etwas bewirken.quelle
Eine andere erwähnenswerte Lösung:
quelle