是否有一个内置的方法可以帮助我有效地实现以下目标:给定一个数组,我需要一个数组列表,每个数组都有索引到数组的不同唯一值?
如果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])