为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻阅古今 2021-12-09 10:23:32
假设我有这个数组: [4, 3, 2] 我想得到每 2 个元素的加权平均值。因此,我会得到一个看起来像这样的数组(假设权重是 [0.6, 0.4, 0.6]: [3.6, 2.4]知道如何使用大型阵列(5000)来做到这一点吗?非常感谢!
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

你可以看看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使第一个或第二个元素产生更大的影响;


查看完整回答
反对 回复 2021-12-09
?
动漫人物

TA贡献1815条经验 获得超10个赞

对于更一般的结果,我认为您应该重新归一化权重,使每对的总和为 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]thennormalized_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]


查看完整回答
反对 回复 2021-12-09
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

给定两个变量:


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]


查看完整回答
反对 回复 2021-12-09
  • 3 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信