忽略第三个维度,既然它似乎不进入问题,如何:
# Generate array of size (m*k, n*k)
# my m, n are your m, n divided by k
m, n = 2, 4
k = 3
x = np.arange(m*n*k*k).reshape((m*k, n*k))
# array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
# [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
# [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47],
# [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
# [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71]])
# Calculate means of each block
y = x.reshape((m, k, n, k))
z = np.moveaxis(y, -3, -2) # now shape is (m, n, k, k)
np.mean(z, axis=(-2, -1)) # take mean over last two axes
# or just np.mean(y, axis=(-3, -1))
# array([[13., 16., 19., 22.],
# [49., 52., 55., 58.]])
为了保留第三维度并分别对每个 colored颜色 通道进行计算,只需在开始时将其移开(例如,移到轴0
),然后在结束时将其移回.
如果行数和/或列数不能被k
整除,则可以在数组中填充一些不会出现在数据中的哨兵值(例如nan
),直到行数/列数可以被k
整除.然后,以忽略哨兵值的方式取均值(例如nanmean
).(或者,拆分剩余的行/列,分别处理它们,并合并结果.
可能有一些东西在scipy.ndimage
或scikit—image,将完成这一行.我try 了zoom
,但没有找到一个神奇的设置组合,以提供所需的结果.