且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Numpy重新绑定2D数组

更新时间:2022-11-09 23:32:21

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

You can use a higher dimensional view of your array and take the average along the extra dimensions:

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]])

通常,如果要为(rows, cols)的数组分配形状为(a, b)的容器,则将其重塑为.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)可以正常工作,但是却很难理解发生了什么.

In general, if you want bins of shape (a, b) for an array of (rows, cols), your reshaping of it should be .reshape(rows // a, a, cols // b, b). Note also that the order of the .mean is important, e.g. a_view.mean(axis=1).mean(axis=3) will raise an error, because a_view.mean(axis=1) only has three dimensions, although a_view.mean(axis=1).mean(axis=2) will work fine, but it makes it harder to understand what is going on.

照原样,上面的代码仅在您可以在数组中容纳整数个bin的情况下才有效,即a除以rows并且b除以cols.有很多方法可以处理其他情况,但是您将必须定义自己想要的行为.

As is, the above code only works if you can fit an integer number of bins inside your array, i.e. if a divides rows and b divides cols. There are ways to deal with other cases, but you will have to define the behavior you want then.