gpt4 book ai didi

python - 快速取 .numpy 数组中每 N 行平均值的方法

转载 作者:太空狗 更新时间:2023-10-30 00:31:49 48 4
gpt4 key购买 nike

我有一个非常大的带掩码的 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)

一定有更优雅的方式来做到这一点。非常感谢!

最佳答案

ab 两个值的平均值是 0.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。向量vmm+n元素之和等于减去第m-1 cumsum(v) 的第 m+n 个元素中的元素。 除非 m 为 0,否则您不会减去任何内容 (result[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

关于python - 快速取 .numpy 数组中每 N 行平均值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379311/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com