Средневзвешенное значение каждого из 2 элементов Numpy - PullRequest
1 голос
/ 19 марта 2019

Если у меня есть этот массив: [4, 3, 2] Я хотел бы получить средневзвешенное значение для каждого из 2 элементов. Таким образом, я бы получил массив, который выглядит следующим образом (при условии, что веса равны [0,6, 0,4, 0,6]: [3.6, 2.4]

Есть идеи, как мне это сделать с большими массивами (5000)?

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Вы можете взглянуть на метод 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, чтобы первый или второй элемент оказали большее влияние;

0 голосов
/ 19 марта 2019

Для более общего результата, я думаю, вам следует перенормировать веса таким образом, чтобы сумма каждой пары равнялась 1. Это означает, что каждый вес может иметь разные перенормированные значения в паре с его предыдущим или следующим весом.

Допустим, что weights - это массив пустых чисел с весами:

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]
0 голосов
/ 19 марта 2019

Учитывая две переменные:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...