如何在2D数组上获得与numpy.where相同的结果而不从同一行获取2个索引

时间:2016-04-15 18:16:34

标签: python arrays numpy

我有一个带有布尔的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来删除不需要的索引。

我想知道是否有更直接的方式来获得我想要的那种结果。

注意:

  • 我使用总是的布尔数组的行至少有1行 真实的价值。
  • 我不关心真正值的倍数是哪一个,我只关心 小心只有1。

2 个答案:

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