当前位置:  开发笔记 > 编程语言 > 正文

Numpy中的Blockwise操作

如何解决《Numpy中的Blockwise操作》经验,为你挑选了1个好方法。

是否有任何便利工具在Numpy阵列上进行块运算?

我正在考虑像Ising自旋重整化这样的操作,其中将矩阵划分为块并返回矩阵,其中每个块由其和,平均或其他函数替换.



1> unutbu..:

你可能正在寻找超级鱼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个轴索引块.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有