如何有效地获取唯一值的索引列表?

是否有一个内置的方法可以帮助我有效地实现以下目标:给定一个数组,我需要一个数组列表,每个数组都有索引到数组的不同唯一值?

如果f是所需的函数,

b = f(a)

u, idxs = unique(a)

然后

b[i] == where(idxs==i)[0]

我知道pandas.Series.groupby()可以做到这一点,但是当有超过10 ^ 5个唯一整数时创建一个dict可能效率不高.

最佳答案 如果你有numpy> = 1.9你可以这样做:

>>> a = np.random.randint(5, size=10)
>>> a
array([0, 2, 4, 4, 2, 4, 4, 3, 2, 1])
>>> unq, unq_inv, unq_cnt = np.unique(a, return_inverse=True, return_counts=True)
>>> np.split(np.argsort(unq_inv), np.cumsum(unq_cnt[:-1]))
[array([0]), array([9]), array([1, 4, 8]), array([7]), array([2, 3, 5, 6])]
>>> unq
array([0, 1, 2, 3, 4])

在早期版本中,您可以获得额外的计数:

>>> unq_cnt = np.bincount(unq_inv)

此外,如果您想确保对每个值的索引进行排序,我认为您需要使用稳定排序,例如np.argsort(unq_inv,kind =’mergesort’)

考虑到你的目标,我认为最大限度地减少对昂贵功能的要求,我认为你不需要做你想要的.假设你的功能是平方的,你可以简单地做:

>>> unq, unq_inv = np.unique(a, return_inverse=True)
>>> f_unq = unq**2
>>> f_a = f_unq[unq_inv]
>>> a
array([0, 2, 4, 4, 2, 4, 4, 3, 2, 1])
>>> f_a
array([ 0,  4, 16, 16,  4, 16, 16,  9,  4,  1])
点赞