Allgemeines Stapeln der Nachbarn von Array-Elementen in ein 3-D-Array

Installiere

ei einem 2D-Array möchte ich ein 3D-Array erstellen, bei dem die Werte entlang der dritten Dimension bei (d. H.stacked[row, col, :]) sind die abgeflachten Nachbarn des ursprünglichen Arrays bei[row, col]. Ich möchte diesen Prozess verallgemeinern, um einen beliebigen (aber vernünftigen) Suchradius zu behandeln.

Prior Research

DiesFrag schien vielversprechend, aber ich bin mir nicht sicher, ob ich seinen Ansatz wirklich nutzen kann, ohne (ein paar)for Schleifen. Mein aktueller Ansatz, der der Kürze halber mit einem Suchradius von 1 angewendet wurde, wird im folgenden Beispiel veranschaulicht.

Auch diesefrage + antwort waren in der Nähe, aber ich bin speziell auf der Suche nach einer Lösung, die nur intelligente Indizierung verwendet, um Schleifen zu vermeiden.

Was ich jetzt habe
import numpy as np
np.random.seed(0)

x = np.random.random_integers(0, 10, size=(4, 5))
print(x)  # * highlights the neighbors we'll see later

[[ 5   0   3   3   7]
 [ 9  *3  *5  *2   4]
 [ 7  *6  *8  *8  10]
 [ 1  *6  *7  *7   8]]

# padding the edges 
padded = np.pad(x, mode='edge', pad_width=1) # pad_width -> search radius
print(padded)

[[ 5  5  0  3  3  7  7]
 [ 5  5  0  3  3  7  7]
 [ 9  9  3  5  2  4  4]
 [ 7  7  6  8  8 10 10]
 [ 1  1  6  7  7  8  8]
 [ 1  1  6  7  7  8  8]]

So können wir dann alle Nachbarn stapeln.Dies ist die Operation, die ich verallgemeinern möchte

blocked = np.dstack([
    padded[0:-2, 0:-2], # upper left
    padded[0:-2, 1:-1], # upper center
    padded[0:-2, 2:],   # upper right
    padded[1:-1, 0:-2], # middle left...
    padded[1:-1, 1:-1],
    padded[1:-1, 2:],
    padded[2:, 0:-2],   # lower left ...
    padded[2:, 1:-1],
    padded[2:, 2:],
])

Und auf die Nachbarn zugreifen, wenn eine Zelle so aussieht (der Aufruf vonreshape nur zur Veranschaulichung)

print(blocked[2, 2, :].reshape(3, 3))
[[3 5 2]
 [6 8 8]
 [6 7 7]]
Primary question

Für einen bestimmten Suchradius gibt es eine effektive Möglichkeit, den Aufruf von @ zu verallgemeinernp.dstack?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage