我认为你可以用 skimage 完成大部分繁琐的工作view_as_blocks http://scikit-image.org/docs/dev/api/skimage.util.html#skimage.util.view_as_blocks。这个函数是实施使用as_strided https://github.com/scikit-image/scikit-image/blob/master/skimage/util/shape.py#l10所以它非常有效(它只是改变步幅信息来重塑数组)。因为它是用 Python/NumPy 编写的,所以如果您没有安装 skimage,您可以随时复制代码。
应用该函数后,您只需对重构数组的 N 个尾轴求和(其中 N 是数组的长度)bucket_size
元组)。这是一个新的bucket()
功能:
from skimage.util import view_as_blocks
def bucket(x, bucket_size):
blocks = view_as_blocks(x, bucket_size)
tup = tuple(range(-len(bucket_size), 0))
return blocks.sum(axis=tup)
那么例如:
>>> x = np.array([1, 3, 7, 3, 2, 9])
>>> bucket(x, bucket_size=(2,))
array([ 4, 10, 11])
>>> x = np.array([[1, 2, 3, 4],
[2, 3, 7, 9],
[8, 9, 1, 0],
[0, 0, 3, 4]])
>>> bucket(x, bucket_size=(2, 2))
array([[ 8, 23],
[17, 8]])
>>> y = np.arange(6*6*6).reshape(6,6,6)
>>> bucket(y, bucket_size=(2, 2, 3))
array([[[ 264, 300],
[ 408, 444],
[ 552, 588]],
[[1128, 1164],
[1272, 1308],
[1416, 1452]],
[[1992, 2028],
[2136, 2172],
[2280, 2316]]])