Numpy重组2D阵列

时间:2013-02-17 00:00:43

标签: numpy binning

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

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

非常感谢......

3 个答案:

答案 0 :(得分: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]])

一般情况下,如果您希望(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除以rowsbcols。有办法处理其他情况,但你必须定义你想要的行为。

答案 1 :(得分:1)

请参阅提供此代码段的the SciPy Cookbook on rebinning

def rebin(a, *args):
    '''rebin ndarray data into a smaller ndarray of the same rank whose dimensions
    are factors of the original dimensions. eg. An array with 6 columns and 4 rows
    can be reduced to have 6,3,2 or 1 columns and 4,2 or 1 rows.
    example usages:
    >>> a=rand(6,4); b=rebin(a,3,2)
    >>> a=rand(6); b=rebin(a,2)
    '''
    shape = a.shape
    lenShape = len(shape)
    factor = asarray(shape)/asarray(args)
    evList = ['a.reshape('] + \
             ['args[%d],factor[%d],'%(i,i) for i in range(lenShape)] + \
             [')'] + ['.sum(%d)'%(i+1) for i in range(lenShape)] + \
             ['/factor[%d]'%i for i in range(lenShape)]
    print ''.join(evList)
    return eval(''.join(evList))

答案 2 :(得分:0)

我假设您只想知道如何通常构建一个性能良好的函数并对数组执行某些操作,就像示例中的numpy.reshape一样。因此,如果性能真的很重要并且您已经在使用numpy,那么您可以编写自己的C代码,就像numpy一样。例如,arange的实现完全在C中。几乎所有在性能方面都很重要的numpy都是用C实现的。

但是,在这样做之前,你应该尝试在python中实现代码,看看性能是否足够好。尝试使python代码尽可能高效。如果它仍然不适合您的性能需求,请走C路。

您可以在docs中了解相关内容。