我有一个带有布尔的numpy数组:
bool_array.shape
Out[84]: (78, 8)
bool_array.dtype
Out[85]: dtype('bool')
我想找到第二个维度为True的索引:
bool_array[30:35]
Out[87]:
array([[False, False, False, False, True, False, False, False],
[ True, False, False, False, True, False, False, False],
[False, False, False, False, False, True, False, False],
[ True, False, False, False, False, False, False, False],
[ True, False, False, False, False, False, False, False]], dtype=bool)
我一直在使用numpy.where来执行此操作,但有时在第二维上有超过1个带有True值的索引。
我想找到一种方法来获得与numpy.where相同的结果,但避免从同一行获得2个索引:
np.where(bool_array)[0][30:35]
Out[88]: array([30, 31, 31, 32, 33])
我目前通过循环遍历numpy.where的结果来解决这个问题,找出哪些n个索引等于n-1,并使用numpy.delete来删除不需要的索引。
我想知道是否有更直接的方式来获得我想要的那种结果。
注意:
答案 0 :(得分:3)
IIUC并且鉴于每行至少有一个TRUE
个元素,您可以沿第二个轴使用np.argmax
来选择每行的第一个TRUE
元素,像这样 -
col_idx = bool_array.argmax(1)
示例运行 -
In [246]: bool_array
Out[246]:
array([[ True, True, True, True, False],
[False, False, True, True, False],
[ True, True, False, False, True],
[ True, True, False, False, True]], dtype=bool)
In [247]: np.where(bool_array)[0]
Out[247]: array([0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3])
In [248]: np.where(bool_array)[1]
Out[248]: array([0, 1, 2, 3, 2, 3, 0, 1, 4, 0, 1, 4])
In [249]: bool_array.argmax(1)
Out[249]: array([0, 2, 0, 0])
说明 -
对应np.where(bool_array)[0]
输出的重复,即:
array([0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3])
,我们需要从np.where(bool_array)[1]
的输出中选择任何人,即:
array([0, 1, 2, 3, 2, 3, 0, 1, 4, 0, 1, 4])
^ ^ ^ ^
因此,使用True
从每行中选择第一个bool_array.argmax(1)
会给我们:
array([0, 2, 0, 0])
答案 1 :(得分:0)
您可以在结果数组上调用np.unique
,如下所示:
>>> np.where(bool_array)[0][30:35]
Out[4]: array([0, 1, 1, 2, 3, 4])
>>> np.unique(np.where(bool_array)[0][30:35])
Out[5]: array([0, 1, 2, 3, 4])