我有许多大的(大于100000000)整数列表,其中包含许多重复项。我想得到每个元素出现的索引。目前我正在做这样的事情:
import numpy as np
from collections import defaultdict
a = np.array([1, 2, 6, 4, 2, 3, 2])
d=defaultdict(list)
for i,e in enumerate(a):
d[e].append(i)
d
defaultdict(<type 'list'>, {1: [0], 2: [1, 4, 6], 3: [5], 4: [3], 6: [2]})
这种迭代每个元素的方法非常耗时。有没有一种有效的或矢量化的方法来做到这一点?在
编辑1 我尝试了Acorbe和Jaime的方法
^{pr2}$结果是
original: 5.01767015457 secs
Acorbe: 6.11163902283 secs
Jaime: 3.79637312889 secs
这可以通过python pandas(python数据分析库)和
DataFrame.groupby
调用来解决。在考虑以下几点
输出
^{pr2}$这与被问到的here非常相似,所以下面是对我的答案的改编。矢量化的最简单方法是使用排序。下面的代码借鉴了即将发布的1.9版的
np.unique
实现,其中包含独特的项目计数功能,请参见here:现在:
^{pr2}$要获得每个值的位置索引,只需执行以下操作:
现在可以构造字典压缩}。在
unq_items
和{注意,
unq_count
不计算最后一个唯一项的出现次数,因为拆分索引数组不需要这样做。如果你想拥有你能做到的所有价值:numpy_indexed包(免责声明:我是它的作者)实现了一个受Jaime启发的解决方案;但是通过测试、良好的界面和许多相关功能:
相关问题 更多 >
编程相关推荐