假设我有这个数组: [4、3、2] 我想获得每2个元素的加权平均值。因此,我将得到一个看起来像这样的数组(假设权重为[0.6,0.4,0.6]: [3.6,2.4]
有什么主意,如何使用大型数组(5000)做到这一点?
非常感谢您!
答案 0 :(得分:1)
您可以看看numpy roll()
方法。
import numpy as np
weight = 0.5
x = np.array([4, 3, 2])
(x*weight + np.roll(x, -1)*(1-weight))[:-1]
输出:
array([ 3.5, 2.5])
Roll方法将对原始数组进行移位,方法是将移位后的数组添加到原始数组,然后将每个数组乘以它们各自的权重(权重之和为1),您将获得加权平均值。所有这些都是矢量化操作,这将使执行过程非常流畅。
您可以使用weight
来使第一个或第二个元素产生更大的影响;
答案 1 :(得分:0)
给出两个变量:
import numpy as np
elements = np.array([4, 3, 2])
weights = np.array([0.6, 0.4, 0.6])
您将两个数组相乘并将它们保存在一个变量中,仅出于可读性考虑:
a = elements * weights
您进行求和。使用函数np.roll
,我们将创建变量a
的副本,但将其移位一个位置:
res = a + np.roll(a, -1)
最后,我们忽略了最后一个元素:
res = res[0:-1]
答案 2 :(得分:0)
对于更一般的结果,我认为您应该对权重进行归一化,以使每对权重之和为1。这意味着,当每个权重与其之前或之后的权重配对时,它们可能具有不同的归一化值。
假设weights
是具有权重的numpy数组:
normalized_weights = np.column_stack((we[:-1], we[1:]))
for i in range(corrwe.shape[0]):
normalized_weights[i][0] = normalized_weights[i][0] / (weights[i] + weights[i+1])
normalized_weights[i][1] = normalized_weights[i][1] / (weights[i] + weights[i+1])
normalized_weights
是一个N x 2矩阵,其中N等于len(weights)-1
。每行包含一对权重,其总和为1。
例如,如果weights = [0.89779725 0.04136924 0.2877373 0.29153165 0.97000642 0.74452243 0.5714133 0.25224212 0.09493403 0.11448254]
,则normalized_weights
为:
[[0.95595112 0.04404888]
[0.12570165 0.87429835]
[0.49672488 0.50327512]
[0.23109223 0.76890777]
[0.56575684 0.43424316]
[0.56577416 0.43422584]
[0.69375285 0.30624715]
[0.72655372 0.27344628]
[0.45332625 0.54667375]]
现在,如果x
是您的数据数组(长度为weights
),则可以通过执行以下操作获得加权的中间点:
weighted_middle_x = x[:-1]*normalized_weights[...,0] + x[1:]*normalized_weights[...,1]