numpy数组映射并取平均值

时间:2011-01-13 01:47:58

标签: python numpy

我有三个数组

import numpy as np
value = np.array ([1, 3, 3, 5, 5, 7, 3])
index = np.array ([1, 1, 3, 3, 6, 6, 6])
data  = np.array ([1, 2, 3, 4, 5, 6])

阵列“索引”& “值”具有相同的大小,我想通过取平均值将项目分组为“值”。例如:对于前两个项目[1,3,... in“value”,在“index”中具有相同的键1,因此对于最终数组,该值是第一个和第一个的平均值。第2项价值:(1 + 3)/ 2等于2

最后一个数组是:

[2, nan, 4, nan, nan, 5]

第一个值是“值”的第1和第2的平均值 第二个值是nan,因为“index”中没有任何键(数组索引中没有“2”)
第三个值是“值”的第3个和第4个的平均值 ...

感谢您的帮助!!!

此致 罗伊

4 个答案:

答案 0 :(得分:3)

>>> [value[index==i].mean() for i in data]
[2.0, nan, 4.0, nan, nan, 5.0]

答案 1 :(得分:3)

也许您想使用numpy.bincount()

value = np.array([1, 3, 3, 5, 5, 7, 3])
index = np.array([1, 1, 3, 3, 6, 6, 6])
np.bincount(index, value) / np.bincount(index)
# array([ NaN,   2.,  NaN,   4.,  NaN,  NaN,   5.])

答案 2 :(得分:0)

这是您正在寻找的一般想法吗?

import numpy as np
value = np.array ([1, 3, 3, 5, 5, 7, 3])
index = np.array ([1, 1, 3, 3, 6, 6, 6])
data  = np.array ([1, 2, 3, 4, 5, 6])

answer = np.array(data, dtype=float)
for i, e in enumerate(data):
    idx = np.where(index==e)[0]
    val = value[idx]
    answer[i] = np.mean(val)

print answer # [  2.  nan   4.  nan  nan   5.]

如果您的data数组非常大,可能会有更好的解决方案。

答案 3 :(得分:0)

我搜索了使用numpy直方图来解决巨大的数组:

value = np.array([1,3,3,5,5,7,3],dtype ='float')
index = np.array([1,1,3,3,6,6,6],dtype ='float')
data = np.array([1,2,3,4,5,6])

sums = np.histogram(index,                        bins = np.arange(index.min(),index.max()+ 2),                        权重=值)[0]
counter = np.histogram(index,                        bins = np.arange(index.min(),index.max()+ 2))[0]

sums / counter

阵列([2.,NaN,4.,NaN,NaN,5。])