我有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
- 所以此处只能0
,1
或2
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]]
什么是更好,更通用的解决方案?
答案 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
,否则是相同的
一些解释,首先使用all
与axis=1
一起测试行如果全部为True。
然后我们使用该掩码来掩盖方括号中的行,第二个arg -1
选择最后一列,最后我们分配新的期望值
答案 1 :(得分:2)
这是一个公平的(所有合法的三胞胎同样可能):
N = 10
bits = np.random.randint(7, size=(N,))
mask = (bits[:, None] & 2**np.arange(3)).astype(bool)