每个价值的指数清单

时间:2016-05-21 08:59:01

标签: python numpy

是否有一个Numpy函数等同于

[array == value for value in np.unique(array)]

[np.where(array == value) for value in np.unique(array)]

如果不是,更有效的方法呢?当你可以一次完成时,这些遍历数组len(np.unique(array))次:

indices = defaultdict(list)
for index, value in enumerate(array):
    indices[value].append(index)

我想要一个不需要显式循环的解决方案。

2 个答案:

答案 0 :(得分:2)

如果您想要的是具有多个唯一编号条件的面具,则可以使用np.unique中的return_inverse执行此操作:

拥有样本数组

>>> a = np.random.randint(5, 10, size=100) # 100 [5-10) random numbers

及其独特的数字和逆映射

>>> unique, inverse = np.unique(a, return_inverse=True)

我们可以创建一个具有额外尺寸的容器(每个唯一编号a.shape + 1维)

>>> indexes = np.zeros((a.shape[0], unique.size), dtype=np.bool)

最后,使用逆映射填充数组:

>>> indexes[np.arange(a.size), inverse] = True

indexes地图在最后一个维度中包含True,与其匹配的唯一编号的索引相对应(unique数组中的顺序)

>>> indexes[:3, :]
array([[False, False, False, False,  True],
       [ True, False, False, False, False],
       [False, False, False,  True, False]], dtype=bool)

每行对应原始数组a的索引,每列对应唯一编号

答案 1 :(得分:1)

你的问题有点含糊不清;但看看numpy_indexed;似乎可以使用npi.indices,npi.contains或npi.in_来解决您的问题。