我有一个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”方式。
答案 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)
注意:
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