Numpy重新绑定2D阵列

Numpy重新绑定2D阵列,numpy,binning,Numpy,Binning,我正在寻找一个快速的公式来对2D numpy数组进行数值分块。通过组合,我的意思是计算子矩阵平均值或累积值。对于ex.x=numpy.arange(16),整形(4,4)将被分成4个子矩阵,每个子矩阵2x2,并给出numpy.array([[2.5,4.5],[10.5,12.5]),其中2.5=numpy.average([0,1,4,5]) 如何以有效的方式执行此类操作。。。我真的不知道该怎么做 非常感谢 我假设您只想知道如何构建一个性能良好的函数,并对数组进行处理,就像示例中的numpy.

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

如何以有效的方式执行此类操作。。。我真的不知道该怎么做


非常感谢

我假设您只想知道如何构建一个性能良好的函数,并对数组进行处理,就像示例中的
numpy.reformate
。所以,如果性能真的很重要,并且您已经在使用numpy,那么您可以像numpy一样为此编写自己的C代码。例如,的实现完全是用C实现的。几乎所有与numpy有关的性能问题都是用C实现的

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


您可以在中了解这一点。

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

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)
的容器用于
(行,列)
,则应将其重新整形为
。重新整形(行//a,列//b,b)
。还要注意的是,
.mean
的顺序很重要,例如
a_视图。mean(axis=1)。mean(axis=3)
会产生错误,因为
a_视图。mean(axis=1)
只有三个维度,尽管
a_视图。mean(axis=1)。mean(axis=2)
可以正常工作,但它更难理解发生了什么

如上所述,仅当您可以在数组中容纳整数个存储箱时,上述代码才有效,即如果
a
分割
b
分割
cols
。有很多方法可以处理其他情况,但您必须定义所需的行为。

请参阅,其中提供了以下代码片段:

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

子矩阵是否保证精确匹配?你们有numpy 1.7吗。可用(这很简单,不是必需的)?我有numpy 1.8dev,但我的工作是在numpy 1.7上更新版本。您可以将其压缩为
.mean(轴=(1,3))
!我不知道这种整形是可能的,太棒了!不幸的是,平均值是按顺序排列的,因此如何获得例如你例子中2,2的子矩阵的平均值(我指的是角点0,1,6,7等)?@user1187727我不认为我理解你的问题,但是
[[0,1],[6,7]
的平均值是
a_view.mean(axis=3)的项
[0,0]
。我认为@user1187727与以下事实相混淆:经过整形的数组(带有
整形(3,2,3,2)
)不是2x2子矩阵的数组,尽管结果无论如何是正确的。