Eine Python-Funktion, die als Argument entweder ein skalares oder ein numpy Array akzeptiert

9

Wie der Titel sagt, nehme ich an, dass ich eine Zeichenfunktion schreiben möchte (vergessen wir jetzt Zeichen (0)), offensichtlich erwarten wir Zeichen (2) = 1 und Zeichen (Array ([- 2, -2,2] )) = Array ([- 1, -1,1]). Die folgende Funktion wird jedoch nicht funktionieren, da sie nicht mit numpy Arrays umgehen kann.

%Vor%

Die nächste Funktion funktioniert auch nicht, da x kein Formelement hat, wenn es nur eine einzelne Zahl ist. Selbst wenn ein Trick wie y = x * 0 + 1 verwendet wird, wird y keine Methode [] haben.

%Vor%

Auch mit der Idee aus einer anderen Frage ( Wie kann ich eine numpige Funktion erstellen, die ein numpy Array, ein iterables oder ein Skalar akzeptiert? ), die nächste Funktion wird nicht funktionieren, wenn x ein ist einzelne Zahl, weil in diesem Fall x.shape und y.shape just () sind und die Indizierung y unzulässig ist.

%Vor%

Die einzige Lösung scheint zu sein, dass man zuerst entscheidet, ob x ein Array oder eine Zahl ist, aber ich möchte wissen, ob es etwas Besseres gibt. Das Schreiben von verzweigtem Code wäre umständlich, wenn Sie viele kleine Funktionen wie diese haben.

    
Taozi 24.10.2014, 06:31
quelle

7 Antworten

1

Ich frage mich, ob es eine vektorisierte Funktion ist, die Sie wollen:

%Vor%     
doug 24.10.2014, 06:50
quelle
2

np.vectorize kann verwendet werden, um das zu erreichen, wäre aber langsam, weil alles, was Sie tun, wenn Ihre dekorierte Funktion mit einem Array aufgerufen wird, die Array-Elemente durchläuft und die skalare Funktion auf jedes anwendet, dh keine numpy-Funktionen nutzt Geschwindigkeit.

Eine Methode, die ich für die Vektorisierung von Funktionen nützlich finde, wenn if-else np.choose verwendet. :

%Vor%

Dies funktioniert, wenn x entweder ein Skalar oder ein Array ist und schneller ist als eine Schleife im Python-Space.

Der einzige Nachteil der Verwendung von np.choose ist, dass es nicht intuitiv ist, if-else Logik auf diese Weise zu schreiben, und der Code ist weniger lesbar. Wenn ich es verwende, füge ich Kommentare wie die oben genannten hinzu, um es dem Leser leichter zu machen, zu verstehen, was vor sich geht.

    
shx2 24.10.2014 06:56
quelle
1

Hier ist eine Lösung:

%Vor%

Dies sollte einen Wert des gleichen Typs wie die Eingabe zurückgeben. Zum Beispiel sign(42) gibt 1 , sign(42.0) gibt 1.0 . Wenn Sie es einem ndarray geben, funktioniert es wie np.sign .

Im Allgemeinen können Sie davon ausgehen, dass Ihre Eingabe ein ND-Array ist. Wenn Sie versuchen, auf ein Attribut oder eine Methode zuzugreifen, die ein ndarray besitzt, aber Ihre Eingabe nicht, dann greifen Sie auf einen Skalartyp zurück. Verwenden Sie Ausnahmen, um dies zu implementieren. Zum Beispiel:

%Vor%     
jme 24.10.2014 16:26
quelle
0

Sie können die Zahl zuerst in ein Einzelelement-Array konvertieren,

und konzentrieren Sie sich dann auf die Arbeit mit Arrays.

Sie müssen immer noch den Typ von x überprüfen, obwohl

    
adrianX 24.10.2014 06:55
quelle
0

Hier ist eine Lösung:

%Vor%     
Irshad Bhat 24.10.2014 07:05
quelle
0

Der Ansatz, den ich vorher gewählt habe, ist ähnlich wie Ihr letztes Beispiel, aber es gibt noch eine zusätzliche Überprüfung für Skalare am Anfang:

%Vor%     
dfreese 16.04.2016 00:37
quelle
0

Einfache Lösung, die Skalare und numpy Arrays behandelt:

%Vor%     
jared 21.01.2018 17:33
quelle

Tags und Links