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

时间:2014-05-26 11:30:35

标签: 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, 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]])

这样做有简单快捷的方法吗?

2 个答案:

答案 0 :(得分:2)

现在无法测试,但我认为这应该可行

arr.argmax(axis=1).T

argmax在numpy 1.9中使用bools shortcircuit,因此对于此用例,应该首选wherenonzero


编辑好的,所以上述解决方案不起作用,但使用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]])

答案 1 :(得分:1)

您似乎希望np.where()the solution of this answer结合使用以查找唯一的行:

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)