Skip to main content
 首页 » 编程设计

python numpy 在返回意外警告的地方

2025年05月04日15myhome

使用 python 2.7,scipy 1.0.0-3

显然我对 numpy where 函数应该如何运行有误解,或者在其运行中存在已知错误。我希望有人可以告诉我哪个并解释一个解决方法来抑制我试图避免的恼人警告。当我使用 pandas 系列 where() 时,我得到了相同的行为。

为简单起见,我将使用一个 numpy 数组作为示例。假设我想在数组上应用 np.log() 并且仅对于值是有效输入的条件,即 myArray>0.0。对于不应应用此功能的值,我想设置 -999.9 的输出标志:

myArray = np.array([1.0, 0.75, 0.5, 0.25, 0.0]) 
np.where(myArray>0.0, np.log(myArray), -999.9) 

我希望 numpy.where() 不会提示数组中的 0.0 值,因为那里的条件为 False,但它确实如此,而且它似乎实际上是针对该 False 条件执行的:

-c:2: RuntimeWarning: divide by zero encountered in log  
array([  0.00000000e+00,  -2.87682072e-01,  -6.93147181e-01, 
        -1.38629436e+00,  -9.99900000e+02]) 

numpy documentation状态:

If x and y are given and input arrays are 1-D, where is equivalent to: [xv if c else yv for (c,xv,yv) in zip(condition,x,y)]

我不同意这种说法,因为

[np.log(val) if val>0.0 else -999.9 for val in myArray] 

根本不提供警告:

[0.0, -0.2876820724517809, -0.69314718055994529, -1.3862943611198906, -999.9]  

那么,这是一个已知错误吗?我不想抑制整个代码的警告。

请您参考如下方法:

您可以仅使用其可选的where 参数在相关位置评估log

np.where(myArray>0.0, np.log(myArray, where=myArray>0.0), -999.9) 

或更有效

mask = myArray > 0.0 
np.where(mask, np.log(myArray, where=mask), -999) 

或者如果你觉得“double where”很丑

np.log(myArray, where=myArray>0.0, out=np.full(myArray.shape, -999.9)) 

这三者中的任何一个都应该抑制警告。