我正在努力寻找Numpy数组中子列表的索引。
a = [[False, True, True, True],
[ True, True, True, True],
[ True, True, True, True]]
sub = [True, True, True, True]
index = np.where(a.tolist() == sub)[0]
print(index)
这段代码给了我
array([0 0 0 1 1 1 1 2 2 2 2])
我无法向我解释。输出不应该是array([1, 2])
,为什么不呢?另外我该如何实现此输出?
答案 0 :(得分:3)
如果我理解正确,这是我的主意:
>>> a
array([[False, True, True, True],
[ True, True, True, True],
[ True, True, True, True]])
>>> sub
>>> array([ True, True, True, True])
>>>
>>> result, = np.where(np.all(a == sub, axis=1))
>>> result
array([1, 2])
有关此解决方案的详细信息:
a == sub
给您
>>> a == sub
array([[False, True, True, True],
[ True, True, True, True],
[ True, True, True, True]])
一个布尔数组,其中对于每一行,True
/ False
的值指示a
中的值是否等于sub
中的对应值。 (sub
正在此处的行中广播。)
np.all(a == sub, axis=1)
给您
>>> np.all(a == sub, axis=1)
array([False, True, True])
与a
等于sub
的行相对应的布尔数组。
在此子结果上使用np.where
可为您提供此布尔数组为True
的索引。
有关您的尝试的详细信息:
np.where(a == sub)
(不需要tolist
)为您提供了两个数组,它们共同指示数组a == sub
是True
的索引。
>>> np.where(a == sub)
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]),
array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]))
如果将这两个数组压缩在一起,则会得到其中a == sub
为True
的行/列索引,即
>>> for row, col in zip(*np.where(a==sub)):
...: print('a == sub is True at ({}, {})'.format(row, col))
a == sub is True at (0, 1)
a == sub is True at (0, 2)
a == sub is True at (0, 3)
a == sub is True at (1, 0)
a == sub is True at (1, 1)
a == sub is True at (1, 2)
a == sub is True at (1, 3)
a == sub is True at (2, 0)
a == sub is True at (2, 1)
a == sub is True at (2, 2)
a == sub is True at (2, 3)
答案 1 :(得分:0)
您也可以仅在本机python中不使用numpy来执行此操作
res = [i for i, v in enumerate(a) if all(e==f for e, f in zip(v, sub))]