Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取每行中第一次出现的索引_Python_Arrays_Numpy_Boolean - Fatal编程技术网

Python 获取每行中第一次出现的索引

Python 获取每行中第一次出现的索引,python,arrays,numpy,boolean,Python,Arrays,Numpy,Boolean,我有一个充满布尔值的数组: array([[[ True, True, False, False, False, False], [ True, False, False, False, False, False]], [[False, False, True, False, True, False], [ True, False, False, False, False, False]], [[ True, False, Fal

我有一个充满布尔值的数组:

array([[[ True,  True, False, False, False, False],
        [ True, False, False, False, False, False]],

       [[False, False, True, False, True, False],
        [ True, False, False, False, False, False]],

       [[ True, False, False, False, False, False],
        [ True, False, False, False, False, False]]], dtype=bool)
我想得到每行中每列中第一次出现True的索引,因此答案如下:

array([[0,0,0],
      [0,1,0],
      [1,0,2],
      [1,1,0],
      [2,0,0],
      [2,1,0]])

有一种简单快速的方法吗?

您似乎希望
np.where()
与查找唯一行相结合:

b = np.array(np.where(a)).T
#array([[0, 0, 0],
#       [0, 0, 1],
#       [0, 1, 0],
#       [1, 0, 2],
#       [1, 0, 4],
#       [1, 1, 0],
#       [2, 0, 0],
#       [2, 1, 0]], dtype=int64)
c = b[:,:2]
d = np.ascontiguousarray(c).view(np.dtype((np.void, c.dtype.itemsize * c.shape[1])))
_, idx = np.unique(d, return_index=True)

b[idx]
#array([[0, 0, 0],
#       [0, 1, 0],
#       [1, 0, 2],
#       [1, 1, 0],
#       [2, 0, 0],
#       [2, 1, 0]], dtype=int64)

现在无法测试,但我认为这应该有效

arr.argmax(axis=1).T
numpy 1.9中bools短路上的
argmax
,因此对于此用例,应首选
where
nonzero


EDITOK,因此上述解决方案不起作用,但使用
argmax
的方法仍然有用:

In [23]: mult = np.product(arr.shape[:-1])

In [24]: np.column_stack(np.unravel_index(arr.shape[-1]*np.arange(mult) +
   ....:                                  arr.argmax(axis=-1).ravel(),
   ....:                                  arr.shape))
Out[24]:
array([[0, 0, 0],
       [0, 1, 0],
       [1, 0, 2],
       [1, 1, 0],
       [2, 0, 0],
       [2, 1, 0]])

您想要第一次出现,还是所有出现?您的措辞建议使用前者,而您的示例输出建议使用后者。我希望在每一行的每一列中第一次出现-一旦我们在一列中找到True,移动到下一列,查找True,切换到下一行,重复。很抱歉,在使用3d数组时,我很难获得正确的措辞。根据numpy 2.0获取项目的第一个索引。您的示例输入和输出有问题,数组的形状是
(3,2,6)
,并且您的输出具有形状
(6,3)
但是在输出中使用从0到2的索引,这是一个
索引器。也许您可以这样更好地描述您的问题:在轴
x
上循环,然后在轴
y
上循环,并在轴
z
中找到第一个索引。