您可以使用数组的更高维度视图并沿额外维度取平均值:
In [12]: a = np.arange(36).reshape(6, 6)
In [13]: a
Out[13]:
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]])
In [14]: a_view = a.reshape(3, 2, 3, 2)
In [15]: a_view.mean(axis=3).mean(axis=1)
Out[15]:
array([[ 3.5, 5.5, 7.5],
[ 15.5, 17.5, 19.5],
[ 27.5, 29.5, 31.5]])
一般来说,如果您想要形状的垃圾箱(a, b)
对于一个数组(rows, cols)
,你对它的重塑应该是.reshape(rows // a, a, cols // b, b)
。另请注意,.mean
很重要,例如a_view.mean(axis=1).mean(axis=3)
会引发错误,因为a_view.mean(axis=1)
虽然只有三个维度a_view.mean(axis=1).mean(axis=2)
会工作得很好,但它会让你更难理解正在发生的事情。
事实上,上述代码仅在您可以在数组中容纳整数个 bin 时才有效,即如果a
划分rows
and b
划分cols
。有多种方法可以处理其他情况,但您必须定义您想要的行为。