是否有内置方法可以帮助我有效地实现以下目标:给定一个数组,我需要一个数组列表,每个数组都具有指向该数组不同唯一值的索引?
如果f
是所需功能,
b = f(a)
和
u, idxs = unique(a)
然后
b[i] == where(idxs==i)[0]
我知道pandas.Series.groupby()
可以做到这一点,但是当存在超过10 ^ 5个唯一整数时,创建字典可能并不高效。
如果您的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])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句