什么是获得指向数组中唯一元素的索引组合的好方法。例如a = [1,1,3,2]
,可能的指针集将是{0,2,3}, {1,2,3}
。
我可以结合使用argsort
按频率拆分元素,然后使用类似itertools.product
的内容来获取我想要的所有索引集。
这就是我的尝试:
from numpy import array, split
from scipy.stats import itemfreq
from itertools import product
a = array([1,1,3,2])
fq = itemfreq(a)[:,1]
fq = [int(f + sum(fq[:i])) for i, f in enumerate(fq)]
print list(product(*(ptrs for ptrs in split(a.argsort(), fq) if len(ptrs))))
#> [(0, 3, 2), (1, 3, 2)]
我怎样才能更好地做到这一点?
答案 0 :(得分:3)
这确实可以获得索引,但可能不是您想要的格式:
[np.where(a==x) for x in np.unique(a)]
[(array([0, 1]),), (array([3]),), (array([2]),)]
我想有一种更好的方法,没有for循环。
答案 1 :(得分:1)
@ atomh33ls的答案可以按照以下方式进行矢量化。
首先,提取每个唯一项目的反向索引和计数。如果您使用的是numpy> = 1.9:
_, idx, cnt = np.unique(a, return_inverse=True, return_counts=True)
在旧版本中,这也是如此:
_, idx = np.unique(a, return_inverse=True)
cnt = np.bincount(idx)
现在,有点神奇了,瞧:
>>> np.split(np.arange(len(a))[np.argsort(idx)], np.cumsum(cnt)[:-1])
[array([0, 1]), array([3]), array([2])]