Python 如何在二维数组上获得与numpy.where相同的结果,而不从同一行获得两个索引
我有一个带布尔值的numpy数组: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
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行 真正的价值
- 我不在乎真实值的倍数中还有哪一个,我只在乎 我只想要一个
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_数组具有相同的长度