我有三个阵列,大小相同:
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])
对于每个非唯一对,我需要平均data
- 数组中的相应元素,例如平均值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])
答案 0 :(得分:1)
这是解决问题的'纯粹numpy'解决方案。引用中的纯粹numpy,因为它依赖于我仍在努力的numpy增强提议,但你可以在这里找到完整的代码:
group_by((arr1, arr2)).mean(data)
沃拉,问题解决了。比任何发布的解决方案更快;如果我自己可以这么说的话,也会更加优雅;)。
答案 1 :(得分:0)
从arr1创建一个字典作为键,并将其等效的arr2存储为value。对于每个保存到字典生成其dataunique条目。如果密钥已经存在,则跳过该迭代并继续。
答案 2 :(得分:0)
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]
此方法给出了答案,但破坏了排序。如果排序很重要,您可以使用collections.OrderedDict
答案 3 :(得分:0)
您只需要创建一个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])