每2个Numpy元素的加权平均值

时间:2019-03-18 21:52:02

标签: python numpy

假设我有这个数组: [4、3、2] 我想获得每2个元素的加权平均值。因此,我将得到一个看起来像这样的数组(假设权重为[0.6,0.4,0.6]: [3.6,2.4]

有什么主意,如何使用大型数组(5000)做到这一点?

非常感谢您!

3 个答案:

答案 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]