Wie vektorisiert man eine Funktion, die eine if-Anweisung enthält?

8

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:

%Vor%

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:

zu verwenden %Vor%

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.

    
Daniel Velkov 09.07.2014, 06:11
quelle

4 Antworten

6

Eine Möglichkeit besteht darin, x und y in numpy Arrays innerhalb Ihrer Funktion zu konvertieren:

%Vor%

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.

    
BrenBarn 09.07.2014 06:32
quelle
6

Sie können ein maskiertes Array verwenden, das die Division nur dort ausführt, wo y!=0 :

ist %Vor%     
Saullo Castro 09.07.2014 06:31
quelle
5

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).

    
Pokey McPokerson 09.07.2014 10:20
quelle
4

Ich frage mich, mit welchem ​​Problem Sie konfrontiert sind, mit np.vectorize . Es funktioniert gut auf meinem System:

%Vor%

Beachten Sie, dass das Ergebnis dtype vom Ergebnis des ersten Elements bestimmt wird. Sie können die gewünschte Ausgabe auch selbst festlegen:

%Vor%

Es gibt weitere Beispiele in den Dokumenten .

    
user2379410 09.07.2014 18:34
quelle

Tags und Links