2012-05-02 101 views
0

我有三個陣列,所有具有相同的尺寸的非唯一元素:計算意味着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 = 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 -array,例如平均值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

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

+0

謝謝!我以前不知道收藏品庫。我在這裏沒有python 2.7(所以我不能使用OrderedDict),但順序並不重要。 – oschoudhury

0

使一個字典從ARR1作爲密鑰和存儲它的等效ARR2作爲value.for每個保存到字典生成的值其dataunique條目。如果key已經存在,則跳過該迭代並繼續。

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]) 
+0

不錯和短,雖然由於某種原因,我們仍然沒有python 2.7在這裏。我將不得不堅持@wim的解決方案。 – oschoudhury

1

這裏是「純粹numpy的」解決問題的辦法。在引號純numpy的,因爲它依賴於它,我仍然工作在numpy的改進建議,但你可以在這裏找到的完整代碼:

http://pastebin.com/c5WLWPbp

group_by((arr1, arr2)).mean(data) 

瞧,問題就迎刃而解了。比任何發佈的解決方案快得多;如果我可以這樣說,我也會更加優雅)。