Dan*_*ler 9 arrays numpy matrix
是否有任何便利工具在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]])
Run Code Online (Sandbox Code Playgroud)
并且你希望将它"切成"成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)
Run Code Online (Sandbox Code Playgroud)
现在你可以对其进行整形,以便一个块中的所有值都在最后一个轴中:
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]])
Run Code Online (Sandbox Code Playgroud)
现在您可以沿着该轴求和,或者取其平均值或将其他函数应用于每个块的元素:
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])
Run Code Online (Sandbox Code Playgroud)
与我的第一个答案不同,它只能应用于2D数组,
blockwise_view
可以应用于任意N维数组.它返回一个2N维数组,其中前N个轴索引块.
归档时间: |
|
查看次数: |
786 次 |
最近记录: |