0

我有一个可能包含重复项的数据集。为了在数据集中找到重复项,我将索引放入一个 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'])

我想知道一个带有 array([12322323,'IBM']) 的数组

我已经研究过使用独特的和差异的功能,但那些似乎没有做这项工作。

4

1 回答 1

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])
于 2012-09-27T04:38:53.703 回答