您可能正在寻找超级蝙蝠鱼的blockwise_view。这使用np.lib.stride_tricks.as_strided
创建数组的视图,将数组的“块”放置在它们自己的轴中。
例如,假设您有一个二维数组,例如,
In [97]: arr = np.arange(24).reshape(6, 4)
In [98]: arr.shape
Out[98]: (6, 4)
In [99]: arr
Out[99]:
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]])
你想把它“砍”成 4 块形状 (3, 2)。你可以使用blockwise_view将其转换为形状为 (4, 3, 2) 的 4D 数组:
In [34]: blocked = blockwise_view(arr, (3, 2)); blocked
Out[34]:
array([[[[ 0, 1],
[ 4, 5],
[ 8, 9]],
[[ 2, 3],
[ 6, 7],
[10, 11]]],
[[[12, 13],
[16, 17],
[20, 21]],
[[14, 15],
[18, 19],
[22, 23]]]])
In [37]: blocked.shape
Out[37]: (2, 2, 3, 2)
现在您可以重新调整它的形状,以便一个块中的所有值都位于最后一个轴中:
In [41]: reshaped = blocked.reshape(-1, 3*2); reshaped
Out[41]:
array([[ 0, 1, 4, 5, 8, 9],
[ 2, 3, 6, 7, 10, 11],
[12, 13, 16, 17, 20, 21],
[14, 15, 18, 19, 22, 23]])
现在您可以沿该轴求和,或者取其平均值或对每个块的元素应用一些其他函数:
In [103]: reshaped.sum(axis=-1)
Out[103]: array([ 27, 39, 99, 111])
In [104]: reshaped.mean(axis=-1)
Out[104]: array([ 4.5, 6.5, 16.5, 18.5])
Unlike 我的第一个答案,只能应用于二维数组,blockwise_view
可以应用于任意 N 维数组。它返回一个
2N 维数组,其中前 N 个轴对块进行索引。