Numpy重组2D阵列

use*_*727 11 numpy binning

我正在寻找一个快速的公式来进行2D numpy数组的数值合并.通过分箱我的意思是计算子矩阵平均值或累积值.对于前者 X = numpy.arange(16).reshape(4,4)将被分裂在4子矩阵每个2×2的,并给出numpy.array([[2.5,4.5],[10.5,12.5]]),其中2.5 = numpy的.平均([0,1,4,5])等...

如何以有效的方式执行这样的操作......我真的没有任何想法如何执行此操作...

非常感谢...

Jai*_*ime 17

您可以使用数组的更高维度视图,并采用额外维度的平均值:

In [12]: a = np.arange(36).reshape(6, 6)

In [13]: a
Out[13]: 
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],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

In [14]: a_view = a.reshape(3, 2, 3, 2)

In [15]: a_view.mean(axis=3).mean(axis=1)
Out[15]: 
array([[  3.5,   5.5,   7.5],
       [ 15.5,  17.5,  19.5],
       [ 27.5,  29.5,  31.5]])
Run Code Online (Sandbox Code Playgroud)

一般来说,如果你想要(a, b)一个数组的形状的箱子(rows, cols),你应该重塑它.reshape(rows // a, a, cols // b, b).还要注意,顺序.mean是重要的,例如a_view.mean(axis=1).mean(axis=3)会引发错误,因为a_view.mean(axis=1)只有三个维度,虽然a_view.mean(axis=1).mean(axis=2)可以正常工作,但它会让人更难理解发生了什么.

原样,上面的代码只有在你可以在数组中包含整数个二进制位时才有效,即如果a除以rowsb除以cols.有办法处理其他情况,但您必须定义您想要的行为.

  • 在numpy 1.7.你可以把它压成`.mean(轴=(1,3))`! (4认同)