找出两个numpy结构化数组之间的差异

时间:2012-09-27 04:01:43

标签: python 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'])

我已经研究过使用独特和不同的功能,但那些似乎没有做到这一点。

1 个答案:

答案 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