我有一個3維numpy陣列,形狀爲Nx64x64。我想通過取平均值在1維和2維下采樣,產生一個Nx8x8形狀的新陣列。下采樣數組的最佳方式是什麼?
我有幾個工作實現,但我覺得必須有一個更好的方式來做到這一點。
我最初嘗試使用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
我也使用普通索引的嘗試:
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
我已經不知道如何使用itertools.groupby,但也顯得相當複雜。
有誰知道一個乾淨的解決方案?