一行中没有所有 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
- 所以这里只能是 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]]
什么是更好更通用的解决方案?
你可以这样做:
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
否则是相同的
一些解释,首先使用all
和axis=1
来测试row-wise是否都是True。
然后我们使用该掩码来屏蔽方括号中的行,第二个参数 -1
选择最后一列,最后我们分配新的所需值
这是一个公平的(所有合法三胞胎的可能性均等):
N = 10
bits = np.random.randint(7, size=(N,))
mask = (bits[:, None] & 2**np.arange(3)).astype(bool)
我有 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]]
什么是更好更通用的解决方案?
你可以这样做:
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
否则是相同的
一些解释,首先使用all
和axis=1
来测试row-wise是否都是True。
然后我们使用该掩码来屏蔽方括号中的行,第二个参数 -1
选择最后一列,最后我们分配新的所需值
这是一个公平的(所有合法三胞胎的可能性均等):
N = 10
bits = np.random.randint(7, size=(N,))
mask = (bits[:, None] & 2**np.arange(3)).astype(bool)