2012-09-27 61 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