Ich habe ein 3-dimensionales, numpiges Array mit der Form Nx64x64. Ich möchte es über die Dimensionen 1 und 2 downsampeln, indem ich den Mittelwert nehme, was zu einem neuen Array mit der Form Nx8x8 führt.Was ist der beste Weg, um ein numpy Array downsampling?
Ich habe ein paar funktionierende Implementierungen, aber ich habe das Gefühl, dass es einen besseren Weg geben muss.
Ich versuchte zunächst zu verwenden np.split:
def subsample(inparray, n):
inp = inparray.copy()
res = np.moveaxis(np.array(np.hsplit(inp, inp.shape[1]/n)), 1, 0)
res = np.moveaxis(np.array(np.split(res, inp.shape[2]/n, axis=3)), 1, 0)
res = np.mean(res, axis=(3,4))
return res
Ich habe auch versucht Ebene Indizierung:
def subsample2(inparray, n):
res = np.zeros((inparray.shape[0], n, n))
lin = np.linspace(0, inparray.shape[1], n+1).astype(int)
bounds = np.stack((lin[:-1], lin[1:]), axis=-1)
for i, b in enumerate(bounds):
for j, b2 in enumerate(bounds):
res[:, i, j] = np.mean(inparray[:, b[0]:b[1], b2[0]:b2[1]], axis=(1,2))
return res
ich über die Verwendung von itertools.groupby gewundert hatte, aber es sah auch recht kompliziert.
Kennt jemand eine saubere Lösung?