Betrachten Sie ein 3D-Numy-Array D
der Dimension, sagen wir, (30 x 40 x 50). Für jedes Voxel D[x,y,z]
möchte ich einen Vektor speichern, der benachbarte Voxel innerhalb eines bestimmten Radius enthält (einschließlich der D[x,y,z]
selbst).Suchscheinwerfervektoren für ein gegebenes numpy Array zurückgeben
(hier als Beispiel ist ein Bild einer solchen Kugel mit dem Radius 2: https://puu.sh/wwIYW/e3bd63ceae.png)
Gibt es eine einfache und schnelle Möglichkeit, dies zu codieren?
Ich habe eine Funktion dafür geschrieben, aber es ist schmerzhaft langsam und IDLE schließlich stürzt ab, weil die Datenstruktur, in der ich die Vektoren speichern soll, zu groß wird.
Aktuelle Code:
def searchlight(M_in):
radius = 4
[m,n,k] = M_in.shape
M_out = np.zeros([m,n,k],dtype=object)
count = 0
for i in range(m):
for j in range(n):
for z in range(k):
i_interval = list(range((i-4),(i+5)))
j_interval = list(range((j-4),(j+5)))
z_interval = list(range((z-4),(z+5)))
coordinates = list(itertools.product(i_interval,j_interval,z_interval))
coordinates = [pair for pair in coordinates if ((abs(pair[0]-i)+abs(pair[1]-j)+abs(pair[2]-z))<=radius)]
coordinates = [pair for pair in coordinates if ((pair[0]>=0) and (pair[1]>=0) and pair[2]>=0) and (pair[0]<m) and (pair[1]<n) and (pair[2]<k)]
out = []
for pair in coordinates:
out.append(M_in[pair[0],pair[1],pair[2]])
M_out[i,j,z] = out
count = count +1
return M_out
Danke! Aus Platzgründen ausgewählt und auf Optimierung fokussiert. – Shoogiebaba