快速获取.npy数组中每N行的平均值

Emi*_*ily 5 python numpy

我有一个非常大的蒙面NumPy数组(originalArray)有很多行和两列.我想取每两行的平均值originalArray并构建一个newArray其中每行是两行的平均值originalArray(因此行newArray数的一半originalArray).这应该是一件简单的事情,但下面的脚本非常慢.非常感谢社区的任何建议.

newList = []
for i in range(0, originalArray.shape[0], 2):
    r = originalArray[i:i+2,:].mean(axis=0)
    newList.append(r)
newArray = np.asarray(newList)
Run Code Online (Sandbox Code Playgroud)

必须有一种更优雅的方式来做到这一点.非常感谢!

swe*_*zel 11

两个值的平均值a,并b0.5*(a+b)
因此你可以做这样的:

newArray = 0.5*(originalArray[0::2] + originalArray[1::2])
Run Code Online (Sandbox Code Playgroud)

它将所有两个连续的行相加,最后将每个元素相乘0.5.

因为在标题中你要求平均N行,这里有一个更通用的解决方案:

def groupedAvg(myArray, N=2):
    result = np.cumsum(myArray, 0)[N-1::N]/float(N)
    result[1:] = result[1:] - result[:-1]
    return result
Run Code Online (Sandbox Code Playgroud)

平均n元素的一般形式是sum([x1,x2,...,xn])/n.元素的总和m,以m+n在矢量v相同减去m-1从第i个元素m+n的第i个元素cumsum(v).除非m是0,否则你不会减去任何东西(结果[0]).
这就是我们在这里利用的.此外,因为一切都是线性的,所以在我们分开的地方并不重要N,所以我们在开始时就这么做,但这只是品味问题.

如果最后一个组的N元素少于元素,则将完全忽略它.如果你不想忽略它,你必须特别对待最后一组:

def avg(myArray, N=2):
    cum = np.cumsum(myArray,0)
    result = cum[N-1::N]/float(N)
    result[1:] = result[1:] - result[:-1]

    remainder = myArray.shape[0] % N
    if remainder != 0:
        if remainder < myArray.shape[0]:
            lastAvg = (cum[-1]-cum[-1-remainder])/float(remainder)
        else:
            lastAvg = cum[-1]/float(remainder)
        result = np.vstack([result, lastAvg])

    return result
Run Code Online (Sandbox Code Playgroud)


Jon*_*ona 5

您的问题(每两行两列的平均值):

>>> a = np.reshape(np.arange(12),(6,2))
>>> a
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
>>> a.transpose().reshape(-1,2).mean(1).reshape(2,-1).transpose()
array([[  1.,   2.],
       [  5.,   6.],
       [  9.,  10.]])
Run Code Online (Sandbox Code Playgroud)

其他尺寸(每四行三列的平均值):

>>> a = np.reshape(np.arange(24),(8,3))
>>> a
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]])
>>> a.transpose().reshape(-1,4).mean(1).reshape(3,-1).transpose()
array([[  4.5,   5.5,   6.5],
       [ 16.5,  17.5,  18.5]])
Run Code Online (Sandbox Code Playgroud)

对于具有c列的二维数组a ,取r行平均值的一般公式:

a.transpose().reshape(-1,r).mean(1).reshape(c,-1).transpose()
Run Code Online (Sandbox Code Playgroud)