Nehmen wir an, wir haben die folgende Funktion:
%Vor% Dies funktioniert gut mit skalaren Werten. Leider, wenn ich versuche, numpy Arrays für x
und y
zu verwenden, wird der Vergleich y == 0
als Array-Operation behandelt, was zu einem Fehler führt:
Ich habe versucht, np.vectorize
zu verwenden, aber es macht keinen Unterschied, der Code schlägt immer noch mit dem gleichen Fehler fehl. np.vectorize
ist eine Option, die das erwartete Ergebnis liefert.
Die einzige Lösung, an die ich denken kann, ist np.where
für das Array y
mit etwas wie:
was für Skalare nicht funktioniert.
Gibt es eine bessere Möglichkeit, eine Funktion zu schreiben, die eine if-Anweisung enthält? Es sollte mit Skalaren und Arrays arbeiten.
Eine Möglichkeit besteht darin, x
und y
in numpy Arrays innerhalb Ihrer Funktion zu konvertieren:
Dies funktioniert, wenn einer von x
oder y
ein Skalar ist und der andere ein numpy Array ist. Es funktioniert auch, wenn beide Arrays gesendet werden können. Es wird nicht funktionieren, wenn sie Arrays von inkompatiblen Formen sind (z. B. 1D-Arrays unterschiedlicher Länge), aber es ist nicht klar, was das gewünschte Verhalten in diesem Fall sowieso wäre.
Sie können ein maskiertes Array verwenden, das die Division nur dort ausführt, wo y!=0
:
Eine klobige, aber effektive Möglichkeit besteht darin, die Daten grundsätzlich vorzuverarbeiten:
%Vor%Ich habe die verschiedenen Ansätze zeitlich abgestimmt:
%Vor%Die erste Funktion ist die schnellste und hat keine Warnungen. Die Zeitverhältnisse sind ähnlich, wenn x oder y Skalare sind. Für höherdimensionale Arrays wird der maskierte Array-Ansatz relativ schneller (ist aber immer noch der langsamste).
Ich frage mich, mit welchem Problem Sie konfrontiert sind, mit np.vectorize
. Es funktioniert gut auf meinem System:
Beachten Sie, dass das Ergebnis dtype
vom Ergebnis des ersten Elements bestimmt wird. Sie können die gewünschte Ausgabe auch selbst festlegen:
Es gibt weitere Beispiele in den Dokumenten .
Tags und Links python arrays numpy vectorization