我有一个可能包含重复项的数据集。为了找到数据集中的重复项,我将索引放入一个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'])
我已经研究过使用独特和不同的功能,但那些似乎没有做到这一点。
答案 0 :(得分: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
的{{1}}来获取显示如何从唯一元素数组中重新创建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