使用numpy进行快速元素节点平均

时间:2018-06-13 07:06:25

标签: python algorithm numpy

我在Windows上使用Python 3.6.2和numpy。

我有两个数组,

整数数组[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 - avg 5.5 7在索引数组中出现两次,关联值为8和8 - avg 8.0

阵列可能非常大 - 高达1亿。

当然,这很容易暴力,但是在Python / numpy中有一种快速且内存有效的方法来实现这一点吗?

提前致谢,

道格

2 个答案:

答案 0 :(得分:2)

您可以使用numpy searchFilter.LogicalOperator = FilterLogicalOperator.[Or] ufuncs

np.bincount

编辑:正如@Divakar所指出的,你可以做到

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

答案 1 :(得分:0)

一个非常简单的解决方案就是使用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