是否有单个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)


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

最佳答案

如果您想要的是具有多个唯一编号条件的掩码,则可以使用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的索引,每列对应于唯一编号。

关于python - 每个值的索引列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37360874/

10-12 05:27