Ich habe ein 2d numpy Array., A
Ich möchte np.bincount()
auf jede Spalte der Matrix A
anwenden, um ein weiteres 2D-Array B
zu erzeugen, das sich aus den Einzelbits jeder Spalte des Originals zusammensetzt Matrix A
.
Mein Problem ist, dass np.bincount () eine Funktion ist, die ein 1d-array-like benötigt. Es ist keine Array-Methode wie zum Beispiel B = A.max(axis=1)
.
Gibt es eine pythonisch / numpythische Art, dieses B
-Array anders als eine fiese For-Schleife zu erzeugen?
Ich würde vorschlagen, np.apply_along_axis
zu verwenden, was Ihnen erlauben wird um eine 1D-Methode (in diesem Fall np.bincount
) auf 1D-Schichten eines höherdimensionalen Arrays anzuwenden:
Sie müssen jedoch vorsichtig sein. Dies (wie auch Ihr vorgeschlagener for
-loop) funktioniert nur, wenn die Ausgabe von np.bincount
die richtige Form hat. Wenn der maximale Status nicht in einer oder mehreren Spalten Ihres Arrays A
vorhanden ist, hat die Ausgabe keine kleinere Dimensionalität und der Code wird daher mit einem ValueError
gespeichert.
Diese Lösung, die das Paket numpy_indexed verwendet (Disclaimer: Ich bin der Autor), ist vollständig vektorisiert und enthält daher keine Python-Schleifen hinter den Kulissen. Außerdem gibt es keine Einschränkungen für die Eingabe. Nicht jede Spalte muss denselben Satz eindeutiger Werte enthalten.
%Vor%Dies gibt eine alternative (spärliche) Darstellung des gleichen Ergebnisses, die viel passender sein kann, wenn das B-Array tatsächlich viele Nullen enthält:
%Vor%Beachten Sie, dass apply_along_axis nur syntaktischer Zucker für eine for-Schleife ist und die gleichen Leistungsmerkmale aufweist.