一行中没有所有 True 值的布尔数组

Boolean array with no all True values in one row

我有 numpy array:

np.random.seed(100)
mask = np.random.choice([True, False], size=(10,3))
print (mask)
[[ True  True False]
 [False False False]
 [ True  True  True] <- problem - all values True
 [ True  True False]
 [ True  True  True] <- problem - all values True
 [ True False  True]
 [ True False  True]
 [False  True  True]
 [ True False False]
 [False  True  True]]

每一行都不需要所有值 True - 所以这里只能是 012 True 因为 3 'columns'.

丑陋的解决方案是:

mask[:, -1] = False
print (mask)
[[ True  True False]
 [False False False]
 [ True  True False]
 [ True  True False]
 [ True  True False]
 [ True False False]
 [ True False False]
 [False  True False]
 [ True False False]
 [False  True False]]

什么是更好更通用的解决方案?

你可以这样做:

In [109]:
mask[mask.all(axis=1),-1] = False
mask

Out[109]:
array([[ True,  True, False],
       [False, False, False],
       [ True,  True, False],
       [ True,  True, False],
       [ True,  True, False],
       [ True, False,  True],
       [ True, False,  True],
       [False,  True,  True],
       [ True, False, False],
       [False,  True,  True]], dtype=bool)

所以只需使用 all 测试 row-wise 并在此条件下仅将第 3 列设置为 False

感谢@Divakar,您可以输入更少的内容:

In [110]:
mask[mask.all(1),2] = 0
mask

Out[110]:
array([[ True,  True, False],
       [False, False, False],
       [ True,  True, False],
       [ True,  True, False],
       [ True,  True, False],
       [ True, False,  True],
       [ True, False,  True],
       [False,  True,  True],
       [ True, False, False],
       [False,  True,  True]], dtype=bool)

所以这里位置 arg axis 被设置并且 0 被转换为布尔值 False 否则是相同的

一些解释,首先使用allaxis=1来测试row-wise是否都是True。

然后我们使用该掩码来屏蔽方括号中的行,第二个参数 -1 选择最后一列,最后我们分配新的所需值

这是一个公平的(所有合法三胞胎的可能性均等):

N = 10
bits = np.random.randint(7, size=(N,))
mask = (bits[:, None] & 2**np.arange(3)).astype(bool)