我是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
数组。但我还是希望不要看到除以零的警告。
谢谢
问题是 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)
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
因为第一要素 Period
是 0.0
.