Numpy递归比较行中的所有数据

时间:2014-05-05 19:15:02

标签: python numpy

我有一个booleen numpy数组如下:

bool_arr = array([[ True,  True,  True,  True],
                  [False, False,  True,  True],
                  [False, False, False,  True]], dtype=bool)

我希望沿着行比较仅True的第一个实例返回True,否则返回False。因此,我想bool_arr的比较的正确答案是:

ans = array([[ True,  False,  False,  False],
             [False, False,  True,  False],
             [False, False, False,  True]], dtype=bool)

我无法弄清楚没有循环的“Numpy”方式。

2 个答案:

答案 0 :(得分:4)

您可以计算沿轴= 1的累积和,两次,并将第一个True值检测为具有值1的值:

bool_arr.cumsum(axis=1).cumsum(axis=1) == 1
=>
array([[ True, False, False, False],
       [False, False,  True, False],
       [False, False, False,  True]], dtype=bool)

注意:

  • 将算术(例如sum)应用于bool值,将它们视为整数0和1
  • 仅应用cumsum一次将适用于qeustion中的示例,但不适用于在第一个False之后紧接True的情况。第二个cumsum负责处理。

答案 1 :(得分:1)

您可以沿轴= 1使用argmax来查找每行中第一个True值的索引,然后构造一个新数组并在这些索引中指定True:< / p>

res = zeros_like(bool_arr)
res[arange(res.shape[0]),argmax(bool_arr, axis=1)] = True

这取决于argmax返回最大值 first 的索引。


编辑: @unutbu指出这对于不包含True值的行不起作用。为了使这项工作,我们可以掩盖指数:

m = bool_arr.any(axis=1)
res = zeros_like(bool_arr)
res[ arange(res.shape[0])[m] , argmax(bool_arr, axis=1)[m] ] = True