是否有任何便利工具在Numpy阵列上进行块运算?
我正在考虑像Ising自旋重整化这样的操作,其中将矩阵划分为块并返回矩阵,其中每个块由其和,平均或其他函数替换.
你可能正在寻找超级鱼blockwise_view
.这用于np.lib.stride_tricks.as_strided
创建数组的视图,该视图将数组的"块"放在它们自己的轴中.
例如,假设您有一个2D数组,例如,
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
它将其转换为形状为4D的数组(4,3,2):
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])
与我的第一个答案不同,它只能应用于2D数组,
blockwise_view
可以应用于任意N维数组.它返回一个2N维数组,其中前N个轴索引块.