为什么在Python / NumPy中会出现这种情况:
from numpy import asarray
bools=asarray([False,True])
print(bools)
[False True]
print(1*bools, 0+bools, 0-bools) # False, True are valued as 0, 1
[0 1] [0 1] [ 0 -1]
print(-2*bools, -bools*2) # !? expected same result! :-/
[0 -2] [2 0]
print(-bools) # this is the reason!
[True False]
我认为-bools
返回logical_not(bools)
很奇怪,因为在所有其他情况下,行为都是“算术”,而不是“逻辑”。
想要使用布尔数组作为0/1掩码(或“特征函数”)的人被迫使用某种倒转表达式,例如(0-bools)
或(-1)*bools
,如果忘记了这一点,就很容易出现错误。
为什么会这样,以及获得所需行为的最佳可接受方式是什么? (除了注释之外)
delExpDecay=lambda t,d,a,tau: a*exp(-(t<d)*(t-d)/tau)
,这是一个延迟指数衰减函数,但它并不能正常工作。如果你改变操作的顺序,它居然可以正常工作,这看起来非常奇怪(乘法应该是可交换的,不是吗?)。因此,我将问题简化为最简单的问题。 - lurix66