加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:39:23 所属栏目:Python 来源:网络整理
导读:是否有一个内置的方法可以帮助我有效地实现以下目标:给定一个数组,我需要一个数组列表,每个数组都有索引到数组的不同唯一值? 如果f是所需的函数, b = f(a) 和 u,idxs = unique(a) 然后 b[i] == where(idxs==i)[0] 我知道pandas.Series.groupby()可以做到这
是否有一个内置的方法可以帮助我有效地实现以下目标:给定一个数组,我需要一个数组列表,每个数组都有索引到数组的不同唯一值?

如果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,3,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,8]),array([7]),array([2,5,6])]
>>> unq
array([0,1,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,1])
>>> f_a
array([ 0,16,9,1])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读