быстрое усреднение узловых элементов с использованием NumPy - PullRequest
0 голосов
/ 13 июня 2018

Я использую Python 3.6.2 и numpy в Windows.

У меня есть два массива,

целочисленный массив [I1, I2, I3, I4]

массив значений с плавающей точкой [VI1, VI2, VI3, Vi4]

Массивы одинаковой длины

Целые числа в первом массиве могут повторяться

Значения вВторой массив связан с целым числом в том же месте в первом массиве.

Для каждого уникального целого числа в первом массиве мне нужно найти все вхождения этого целого числа в первом массиве и затем вычислитьсреднее значение всех значений в соответствующем месте во втором массиве.

Дано массив индекса [1, 5, 7, 5, 9, 7, 4]

и массив значений [9, 4, 8, 7, 2, 8, 6]

1, 9 и 4 встречаются один раз в массиве индексов и связаны со значениями 9, 2 и 6, которые также являются средними значениями для этих индексов.

5 появляется дважды в массиве индекса со связанными значениями 4 и 7 - в среднем 5,5 7 появляется дважды в массиве индексас соответствующими значениями 8 и 8 - в среднем 8,0

Массивы могут быть очень большими - до 100 млн.

Конечно, это грубая сила, но есть быстрый иэффективный способ памяти для достижения этого в Python / numpy?

Заранее спасибо,

Doug

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы можете использовать numy ufuncs и np.bincount:

s = np.zeros(i.max())
np.add.at(s, v, i)
c = np.bincount(i)
idx = np.nonzero(c)
out = s[idx] / c[idx]

РЕДАКТИРОВАТЬ: Как @Divakar, вы можете просто сделать

def nodal_average(i, v):
    s = np.bincount(i, v)
    c = np.bincount(i)
    idx = np.nonzero(c)
    out = s[idx] / c[idx]
    return idx, out
0 голосов
/ 13 июня 2018

Одним очень простым решением было бы просто использовать Pandas и посмотреть, насколько хорошо оно масштабируется

import numpy as np
import pandas as pd

i = np.array([1, 5, 7, 5, 9, 7, 4])
v = np.array([9, 4, 8, 7, 2, 8, 6])


d = pd.DataFrame({'i': i, 'v': v})
d = d.groupby('i').mean()

, что дает

   v
i     
1  9.0
4  6.0
5  5.5
7  8.0
9  2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...