笛卡尔积用于获取指向NumPy数组中唯一元素的索引集

时间:2014-09-29 11:37:23

标签: python numpy scipy

什么是获得指向数组中唯一元素的索引组合的好方法。例如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)]

我怎样才能更好地做到这一点?

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])]