Blockweise Operationen in Numpy

8

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.

    
Daniel Mahler 17.12.2015, 01:28
quelle

2 Antworten

6

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

%Vor%

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.

    
unutbu 17.12.2015 02:35
quelle
2

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 -

%Vor%

Beispiel zur Berechnung von blockweise sum , average , std usw. -

%Vor%     
Divakar 17.12.2015 06:28
quelle

Tags und Links