Python 如何在二维数组上获得与numpy.where相同的结果,而不从同一行获得两个索引

Python 如何在二维数组上获得与numpy.where相同的结果,而不从同一行获得两个索引,python,arrays,numpy,Python,Arrays,Numpy,我有一个带布尔值的numpy数组: bool_array.shape Out[84]: (78, 8) bool_array.dtype Out[85]: dtype('bool') 我想找出第二维度为真的指数: bool_array[30:35] Out[87]: array([[False, False, False, False, True, False, False, False], [ True, False, False, False, True, False

我有一个带布尔值的numpy数组:

bool_array.shape
Out[84]: (78, 8)

bool_array.dtype
Out[85]: dtype('bool')
我想找出第二维度为真的指数:

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)
我一直在这样做,但有时有超过1个指数沿第二维度的真实值

我想找到一种方法来获得与numpy相同的结果。其中,避免从同一行获得两个索引:

np.where(bool_array)[0][30:35]
Out[88]: array([30, 31, 31, 32, 33])
我目前通过循环numpy.where的结果来解决这个问题,找到哪n个索引等于n-1,并使用移除不需要的索引

我想知道是否有更直接的方法来获得我想要的结果

注:

  • 我使用的布尔数组行始终至少有1行 真正的价值
  • 我不在乎真实值的倍数中还有哪一个,我只在乎 我只想要一个

IIUC并且假设每行至少有一个
TRUE
元素,您只需沿第二个轴选择每行的第一个
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_数组)[0]
输出的重复项,即:

array([0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3])
array([0, 1, 2, 3, 2, 3, 0, 1, 4, 0, 1, 4])
       ^           ^     ^        ^ 
,我们需要从
np的输出中选择任何人。其中(bool_数组)[1]
,即:

array([0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3])
array([0, 1, 2, 3, 2, 3, 0, 1, 4, 0, 1, 4])
       ^           ^     ^        ^ 
因此,使用
bool_array.argmax(1)
从每行中选择第一个
True
,我们可以得到:

array([0, 2, 0, 0])
您可以这样调用结果数组:

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

你不是在找列索引吗?IIUC,我们是否应该从np.where(bool_数组)[1]中挑选与np.where(bool_数组)[0]中的重复项相对应的人?是的。我使用的结果是来自np.where(bool_数组)[1]的结果,但是查看这些结果,没有办法找出我在哪一行中得到了“重复”True。我对使用列中的结果感兴趣,但条件是在np.where(bool_数组)[0]中有任何索引重复。澄清一下:我想要一个np.where(bool_数组)[1]与bool_数组具有相同的长度