Broadcast einer Python-Funktion auf numply Arrays

7

Nehmen wir an, wir haben eine besonders einfache Funktion wie

%Vor%

Diese Funktion funktioniert offensichtlich für mehrere eingebaute Python-Datentypen von x und y wie string, list, int, float, array usw. Da wir uns besonders für Arrays interessieren, betrachten wir zwei Arrays:

%Vor%

Dies gibt

zurück %Vor%

genau wie wir es erwarten würden.

Was nun, wenn man Arrays als Eingänge für die folgende Funktion einwerfen möchte?

%Vor%

doing >>>func(xx, yy) würde einen Fehler auslösen.

Die erste offensichtliche Methode, die man sich vorstellen kann, ist die Funktion sp.vectorize in scipy / numpy. Diese Methode hat sich jedoch als nicht sehr effizient erwiesen. Kann jemand eine robustere Art denken, irgendeine Funktion im Allgemeinen auf numply Arrays zu übertragen?

Wenn Sie den Code in einer Array-freundlichen Weise neu schreiben, ist das die einzige Möglichkeit, es würde helfen, wenn Sie es auch hier erwähnen könnten.

    
bhanukiran 04.03.2011, 18:17
quelle

3 Antworten

11

np.vectorize ist ein allgemeiner Weg, um Python-Funktionen, die auf Zahlen basieren, in numpige Funktionen zu konvertieren, die auf ndarrays funktionieren.

Wie Sie jedoch betonen, ist es nicht sehr schnell, da es eine Python-Schleife "unter der Haube" verwendet.

Um eine bessere Geschwindigkeit zu erreichen, müssen Sie eine Funktion in Handarbeit erstellen, die numpige Arrays als Eingabe erwartet und diesen Vorteil ausnutzt:

%Vor%

Zur Leistung:

test.py :

%Vor%

Läuft:

Mit N = 30:

%Vor%

Mit N = 1000:

%Vor%

Dies deutet darauf hin, dass func2a etwas schneller ist als func2c (und func2b ist schrecklich langsam).

    
unutbu 04.03.2011, 18:40
quelle
10

Für diesen speziellen Fall könnten Sie auch eine Funktion schreiben, die sowohl auf NumPy-Arrays als auch auf einfachen Python-Floats funktioniert:

%Vor%

Diese Version ist auch mehr als vier mal so schnell wie unutbu's func2a() (getestet mit N = 100 ).

    
Sven Marnach 05.03.2011 13:25
quelle
1

Nur um die Grundidee zu verstehen, können Sie Ihre Funktion ändern, zum Beispiel diese Art von Weg:

%Vor%

Also sollte in Ihrem Fall etwas Ähnliches ein vernünftiger Ausgangspunkt sein:

%Vor%

Obwohl diese Art der Verarbeitung Ressourcen zu verschwenden scheint, ist dies nicht unbedingt der Fall. Messen Sie immer die tatsächliche Leistung Ihrer Programme und nehmen Sie dann (nicht frühere) notwendige Änderungen vor.

IMHO für einen zusätzlichen Vorteil: Diese Art der "Vektorisierung" macht Ihren Code wirklich konsistent und lesbar.

    
eat 04.03.2011 18:58
quelle

Tags und Links