在numpy数组中找到相似元素的索引

时间:2018-08-16 20:15:05

标签: python list numpy

我有一个numpy数组,其中有不同的值,其中一些值可能相等。我想返回一个列表列表,每个列表包含相等元素的索引。例如,想象

A=np.array([2,3,2,1,1,1,3,4,5,6,6,6,6,3])

然后我想要的结果应该是

[[0,2],[1,6,13],[3,4,5],[7],[8],[9,10,11,12]]

这是我的解决方案,但我正在寻找一种更智能的方法:

h=[]
s=set()
for i in list_name:

    if i in s:
        continue
    h.append(np.where(list_name==i))
    s.add(i)

print h

6 个答案:

答案 0 :(得分:2)

尝试使用np.unique 1查找数组中的唯一元素。

使用np.where 2遍历此数组。 查找元素为0的所有索引的示例为

numpy.where(x == 0)[0]

答案 1 :(得分:2)

假设顺序无关紧要,那么应该可以。

import numpy as np
input_array = np.array([2,3,2,1,1,1,3,4,5,6,6,6,6,3])
out_array = [np.where(input_array == element)[0].tolist() for element in np.unique(input_array)]

运行此命令,我得到

[[3, 4, 5], [0, 2], [1, 6, 13], [7], [8], [9, 10, 11, 12]]

答案 2 :(得分:1)

您可以使用哈希图。键可以是数组中的int,值可以是存储该int索引的链表。

遍历数组,并为数组中的每个int都将其索引添加到哈希图中。

最后,从地图的列表中检索那些索引。

答案 3 :(得分:1)

查找表可以很好地做到这一点,然后您可以显式地查找它们:

mytable = {}

for i, value in enumerate(list_name):
    mytable[value] = [i, *mytable.get(value,[])]

mytable.get(2)
[0,2]

如果只需要索引,则:

indices = [mytable.get(a) for a in list_name]

[[0,2],[1,6,13],[3,4,5],[7],[8],[9,10,11,12]]

答案 4 :(得分:1)

这不是NumPy解决方案,但可以解决问题(并且也适用于NumPy数组)。

from collections import defaultdict

a = [2, 3, 2, 1, 1, 1, 3, 4, 5, 6, 6, 6, 6, 3]
positions = defaultdict(set)

for index, value in enumerate(a):
    positions[value].add(index)

print(dict(positions))

输出

{2: {0, 2}, 3: {1, 13, 6}, 1: {3, 4, 5}, 4: {7}, 5: {8}, 6: {9, 10, 11, 12}}

答案 5 :(得分:1)

我的尝试

Kinda丑陋的表情最终不得不做得很独特,但是奏效了

import numpy as np
A=np.array([2,3,2,1,1,1,3,4,5,6,6,6,6,3])

def index(my_list, element):
        return [i for i, x in enumerate(my_list) if x == element]
print np.unique(np.array([index(A,i) for i in A]))

>> [[0, 2] [1, 6, 13] [3, 4, 5] [7] [8] [9, 10, 11, 12]]