当使用np.where时,出现意外的除以零的警告。

问题描述 投票:1回答:2

我是numpy的新手,我想用 np.where. 我想实现的很简单,我有4个不同的条件,根据这些条件,我给数组的元素赋值。

Period = np.arange(0.0,8.0,0.01)

Ta = 0.075
Tb = 0.375
Tl = 6.0
Sds = 1.2
Sd1 = 0.45

Sae = np.zeros(len(Period))
Sae = np.where((Period>=0.0) & (Period<=Ta),0.4+0.6*(Period/Ta)*Sds,Sae)
Sae = np.where((Period>=Ta) & (Period<=Tb),Sds,Sae)
Sae = np.where((Period>=Tb) & (Period<=Tl),Sd1/Period,Sae)
Sae = np.where((Period>=Tl),Sd1*Tl/Period**2,Sae)

然后我得到了RuntimeWarning:

RuntimeWarning: divide by zero encountered in true_divide
  Sae = np.where((Period>=Tb) & (Period<=Tl),Sd1/Period,Sae)
RuntimeWarning: divide by zero encountered in true_divide
  Sae = np.where((Period>=Tl),Sd1*Tl/Period**2,Sae)

我知道 Period 数组以0.0开始,但强加的条件应避免遇到被零除的情况。

然而,结果的 Sae 数组。但我还是希望不要看到除以零的警告。

谢谢

python python-3.x numpy numpy-ndarray
2个回答
3
投票

问题是 arr1 / arr2 的调用前进行评估。np.where()因此,NumPy很明智地警告你这个潜在的问题。

如果你绝对确定你的警告不适用于你,你可以忽略它的罪魁祸首行,例如。

with numpy.errstate(divide='ignore'):
    # The problematic line(s)
    Sae = np.where((Period>=Tl),Sd1*Tl/Period**2,Sae)
    ...

更多内容 此处.

或者你可以用一个适当的掩码来避免除以零。例如,这一行。

Sae = np.where((Period>=Tl),Sd1*Tl/Period**2,Sae)

会变成:

mask = Period > 0
temp = np.zeros_like(Period)
temp[mask] = Sd1*Tl/Period[mask]**2
Sae = np.where((Period>=Tl),temp,Sae)

1
投票
Sae = np.where((Period>=Tb) & (Period<=Tl), Sd1/Period, Sae)

相当于

if_mask = (Period>=Tb) & (Period<=Tl)
then = Sd1/Period
else_ = Sae
Sae = np.where(if_mask, then, else_)

你是用零除以 Sd1/Period 因为第一要素 Period0.0.

© www.soinside.com 2019 - 2024. All rights reserved.