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

时间:2017-02-07 14:26:57

标签: python arrays numpy boolean mask

我有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]]

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

2 个答案:

答案 0 :(得分:3)

你可以这样做:

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进行逐行测试,并在此条件下仅将第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一起测试行如果全部为True。

然后我们使用该掩码来掩盖方括号中的行,第二个arg -1选择最后一列,最后我们分配新的期望值

答案 1 :(得分:2)

这是一个公平的(所有合法的三胞胎同样可能):

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