Python numpy阵列对非唯一元素的平均值计算

Python numpy阵列对非唯一元素的平均值计算,python,numpy,Python,Numpy,我有三个相同大小的阵列: arr1 = np.array([1.4, 3.0, 4.0, 4.0, 7.0, 9.0, 9.0, 9.0]) arr2 = np.array([2.3, 5.0, 2.3, 2.3, 4.0, 6.0, 5.0, 6.0]) data = np.array([5.4, 7.1, 9.5, 1.9, 8.7, 1.8, 6.1, 7.4]) arr1可以接受任何浮点值,而arr2只能接受几个浮点值。我想获得arr1和arr2的唯一对,例如 arr1unique =

我有三个相同大小的阵列:

arr1 = np.array([1.4, 3.0, 4.0, 4.0, 7.0, 9.0, 9.0, 9.0])
arr2 = np.array([2.3, 5.0, 2.3, 2.3, 4.0, 6.0, 5.0, 6.0])
data = np.array([5.4, 7.1, 9.5, 1.9, 8.7, 1.8, 6.1, 7.4])
arr1可以接受任何浮点值,而arr2只能接受几个浮点值。我想获得arr1和arr2的唯一对,例如

arr1unique = np.array([1.4, 3.0, 4.0, 7.0, 9.0, 9.0])
arr2unique = np.array([2.3, 5.0, 2.3, 4.0, 6.0, 5.0])
对于每个非唯一对,我需要平均
数据
-数组中的相应元素,例如,平均值9.5和1.9,因为对
(arr1[3],arr2[3])
(arr1[4],arr2[4])
是相等的。与指数6和8对应的数据中的值也是如此。因此,数据数组变为

dataunique = np.array([5.4, 7.1, 5.7, 8.7, 4.6, 6.1])

使用arr1作为键创建字典,并将其等效的arr2作为值存储。对于每个保存到字典的操作,生成其dataunique条目。如果键已存在,则跳过该迭代并继续。

defaultdict
可在此处帮助您:

>>> import numpy as np
>>> arr1 = np.array([1.4, 3.0, 4.0, 4.0, 7.0, 9.0, 9.0, 9.0])
>>> arr2 = np.array([2.3, 5.0, 2.3, 2.3, 4.0, 6.0, 5.0, 6.0])
>>> data = np.array([5.4, 7.1, 9.5, 1.9, 8.7, 1.8, 6.1, 7.4])
>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> for x1, x2, d in zip(arr1, arr2, data):
...   dd[x1, x2].append(d)
... 
>>> arr1unique = np.array([x[0] for x in dd.iterkeys()])
>>> arr2unique = np.array([x[1] for x in dd.iterkeys()])
>>> dataunique = np.array([np.mean(x) for x in dd.itervalues()])
>>> print arr1unique
[ 1.4  7.   4.   9.   9.   3. ]
>>> print arr2unique
[ 2.3  4.   2.3  5.   6.   5. ]
>>> print dataunique
[ 5.4  8.7  5.7  6.1  4.6  7.1]

此方法给出了答案,但破坏了排序。如果排序很重要,则可以对集合执行基本相同的操作。OrderedDict

只需创建一个
OrderedDict
,将键作为元素对存储在(arr1,arr2)中,将值作为元素列表存储在数据中。对于任何重复密钥(arr1和arr2对),重复条目将存储在列表中。然后可以重新遍历字典中的值并创建平均值。要获得唯一的键,只需迭代键并拆分元组

试试下面的方法

>>> d=collections.OrderedDict()
>>> for k1,k2,v in zip(arr1,arr2,data):
    d.setdefault((k1,k2),[]).append(v)      
>>> np.array([np.mean(v) for v in d.values()])
array([ 5.4,  7.1,  5.7,  8.7,  4.6,  6.1])

>>> arr1unique = np.array([e[0] for e in d])
>>> arr2unique = np.array([e[1] for e in d])

这里有一个“纯numpy”的解决方案。纯numpy在引号中,因为它依赖于numpy增强方案,我仍在研究该方案,但您可以在此处找到完整的代码:


瞧,问题解决了。比任何发布的解决方案都快;如果我自己可以这么说的话,那也要优雅得多

谢谢大家!!我以前不知道藏书图书馆的事。我这里没有Python2.7(因此我不能使用OrderedDict),但顺序并不重要。简洁明了,尽管出于某种原因,我们这里仍然没有Python2.7。我必须坚持@wim的解决方案。
group_by((arr1, arr2)).mean(data)