虽然字典是O(n),但Python对象的开销有时使使用numpy函数更方便,这些函数使用排序功能并且是O(n * log n)。在您的情况下,起点将是:
a = [1, 345, 23, 345, 90, 1]unq, unq_idx, unq_cnt = np.unique(a, return_inverse=True, return_counts=True)
如果您使用的numpy版本早于1.9,则最后一行必须是:
unq, unq_idx = np.unique(a, return_inverse=True)unq_cnt = np.bincount(unq_idx)
我们创建的三个数组的内容是:
>>> unqarray([ 1, 23, 90, 345])>>> unq_idxarray([0, 3, 1, 3, 2, 0])>>> unq_cntarray([2, 1, 1, 2])
获取重复项:
cnt_mask = unq_cnt > 1dup_ids = unq[cnt_mask]>>> dup_idsarray([ 1, 345])
获取索引要稍微复杂一点,但是非常简单:
cnt_idx, = np.nonzero(cnt_mask)idx_mask = np.in1d(unq_idx, cnt_idx)idx_idx, = np.nonzero(idx_mask)srt_idx = np.argsort(unq_idx[idx_mask])dup_idx = np.split(idx_idx[srt_idx], np.cumsum(unq_cnt[cnt_mask])[:-1])>>> dup_idx[array([0, 5]), array([1, 3])]



