繁体   English   中英

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

[英]How to obtain the same result as numpy.where over a 2D array without getting 2 indices from the same row

我有一个带有布尔值的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来执行此操作,但是有时在第二维上具有True值的索引不止1个。

我想找到一种方法来获得与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个True值。
  • 我不在乎True值是哪个倍数,我只在乎只有1。

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

因此,使用bool_array.argmax(1)从每一行中选择第一个True会给我们:

array([0, 2, 0, 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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM