【发布时间】:2017-06-13 17:05:10
【问题描述】:
我有一个 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,但它看起来也很复杂。
有人知道干净的解决方案吗?
【问题讨论】: