2012-09-27 63 views
0

我有一個可能包含重複的數據集。爲了找到數據集中,我把指數爲numpy的結構陣列的複製,排序的陣列,從唯一值創建另一個數組,然後比較兩個數組的長度:查找兩個numpy結構陣列之間的區別

data = np.zeros(t_len, dtype={'names':['date', 'symbol'], 'formats':['i8', 'S16']}) 
data[:] = [(x['date'], x['symbol']) for x in tbl.iterrows()] 
data.sort(order=['date', 'symbol']) 
data2 = np.unique(data) 
duplicates = False 

if len(data) != len(data2): 
    duplicates = True 
    print "There are duplicates" 

if not duplicates: 
    print "No duplicates found" 

現在,我真的很想確定包含重複項的索引。舉例來說,如果我有一個包含數據集:

array([12322323,'IBM'], [12322323,'IBM'], [12322323,'MSFT'], [12322323,'IBM']) 

我想知道看到陣列陣列([12322323,「IBM」])

我已經研究過使用獨特的,差異功能,但這些似乎並沒有完成這項工作。

回答

2

爲了簡單起見,我將只使用整數,x的陣列,作爲輸入:

>>> x = np.array([20, 10, 30, 10, 60, 30, 10]) 

隨着numpy的版本1.9.0或更高版本,我們可以使用np.unique獲得獨特的元素,參數return_counts=True,使每一個獨特的元素出現的次數也返回

>>> u, counts = np.unique(x, return_counts=True) 

對於舊版本的numpy的,人們可以使用np.unique的說法return_inverse=True也得到展示瞭如何從獨特元素的數組重新x數組:

>>> u, inv = np.unique(x, return_inverse=True) 
>>> u 
array([10, 20, 30, 60]) 
>>> inv 
array([1, 0, 2, 0, 3, 2, 0]) 

現在使用bincount計算每個元素的出現次數:

>>> counts = np.bincount(inv) 
>>> counts 
array([3, 1, 2, 1]) 

所以現在我們有counts,它告訴我們每個元素出現在數組中的次數。我們可以拉出來的是有重複如下元素:

>>> dups = u[counts > 1] 
>>> dups 
array([10, 30]) 
+0

對於結構化陣列,使用該方法在第一場得到一個新的結構數組,然後檢查等領域遞歸。 –

+0

很簡單!謝謝。 –

+0

其實在np.unique中似乎有一個return_counts參數,所以不需要計數... – ntg