我有一个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
答案 0 :(得分:2)
答案 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]]