在Numpy数组中查找子列表的索引

时间:2018-11-17 15:44:17

标签: python arrays numpy

我正在努力寻找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]),为什么不呢?另外我该如何实现此输出?

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 == subTrue的索引。

>>> 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 == subTrue的行/列索引,即

>>> 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))]