Gibt es Convenience-Dienstprogramme für blockweise Operationen auf Numpy-Arrays?
Ich denke an Operationen wie Ising spin renormalization, wo Sie eine Matrix in Blöcke und Matrix teilen, wo jeder Block durch seine Summe, Durchschnitt oder andere Funktion ersetzt wird.
Sie suchen möglicherweise nach Superfisches blockwise_view
. Dies verwendet np.lib.stride_tricks.as_strided
, um eine Ansicht des Arrays zu erstellen, die "Blöcke" des Arrays in ihren eigenen Achsen platziert.
Angenommen, Sie haben ein 2D-Array wie
%Vor% und Sie möchten es in 4 Blöcke von Form "hacken" (3, 2). Du könntest benutzen
blockwise_view
um es in ein 4D Array von Shape zu konvertieren (4, 3 , 2):
Nun könntest du es so umformen, dass alle Werte von einem Block auf der letzten Achse sind:
%Vor%Jetzt können Sie entlang dieser Achse summieren oder ihren Mittelwert nehmen oder eine andere Funktion auf die Elemente jedes Blocks anwenden:
%Vor% Im Gegensatz zu meine erste Antwort , die nur auf 2D-Arrays angewendet werden kann ,
blockwise_view
kann auf beliebige N-dimensionale Arrays angewendet werden. Es gibt a zurück
2N-dimensionales Array, in dem die ersten N Achsen die Blöcke indizieren.
Für gleitende blockweise Operationen können Sie eine Implementierung aus Implement Matlab's im2col_sliding 'sliding' in python
ausleihen, die dadurch jeden Block in einer Spalte gruppiert Die blockweise Operation würde so einfach wie das Arbeiten mit axis = 0
werden und würde daher alle NumPy ufuncs
für vektorisierte Lösungen. Hier ist eine formale Art, eine solche Funktion zum Erstellen von Gleitblöcken zu definieren -
Beispiel zur Berechnung von blockweise sum
, average
, std
usw. -