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

艾米莉

我有一个非常大的蒙版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)

必须有一种更优雅的方式来执行此操作。非常感谢!

斯文泽尔

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

newArray = 0.5*(originalArray[0::2] + originalArray[1::2])

它将所有连续的两行相加,最后将每个元素乘以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

n元素上的均值的一般形式sum([x1,x2,...,xn])/n向量中mto的元素之和与从的th元素减去th元素相同除非为0,否则您将不减去任何值(结果[0])。这就是我们在这里利用的优势。另外,由于所有内容都是线性的,因此除以并不重要,因此我们一开始就要做,但这只是一个口味问题。m+nvm-1m+ncumsum(v)m
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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章