使用数组计算函数.错误:包含多个元素的数组的真值是不明确的.使用a.a any()或a.a all()



对错误原因进行编码:

def ne_LiNbO3(wvl):
"""
refractive index of pure LiNbO3 from 0.4um to 5um
reference: https://refractiveindex.info
wvl = wavelength in microns
"""
if 0.4 <= wvl <= 5:
return np.real(
np.sqrt(
1
+ 2.9804 * wvl ** 2 / (wvl ** 2 - 0.02047)
+ 0.5981 * wvl ** 2 / (wvl ** 2 - 0.0666)
+ 8.9543 * wvl ** 2 / (wvl ** 2 - 416.08)
)
)
else:
print("wavelength out of range")
return np.nan
x = np.linspace(0.4, 5, 100)
no_LiNbO3(x)

Python返回一条错误消息,突出显示函数中的if语句是导致错误的问题行:ValueError:包含多个元素的数组的真值是不明确的。使用a.a any()或a.a all()

为了解决这个错误,我尝试了np.vectorize()和for循环。在数学函数的背景下,有没有更好的方法来解决这个问题?

您可以使用以下命令获得所需的x子集:

In [251]: wvl = x[(0.4<=x)&(x<=5)]
In [252]: x.shape
Out[252]: (100,)
In [253]: wvl.shape
Out[253]: (100,)

在这里它是全部。该计算适用于整个xwvl子集:

In [254]: arr =np.real(
...:             np.sqrt(
...:                 1
...:                 + 2.9804 * wvl ** 2 / (wvl ** 2 - 0.02047)
...:                 + 0.5981 * wvl ** 2 / (wvl ** 2 - 0.0666)
...:                 + 8.9543 * wvl ** 2 / (wvl ** 2 - 416.08)
...:             )
...:         )
In [255]: arr
Out[255]: 
array([2.3321198 , 2.28372773, 2.25239717, 2.23054905, 2.21452583,
2.20232666, 2.19276115, 2.1850767 , 2.1787749 , 2.17351331,
2.16904941, 2.16520711, 2.16185573, 2.15889652, 2.1562536 ,
...
2.03895049, 2.03656544, 2.03414844, 2.03169918, 2.02921732,
2.02670254, 2.0241545 , 2.02157287, 2.0189573 , 2.01630744,
2.01362295, 2.01090345, 2.00814858, 2.00535798, 2.00253127])

不需要迭代或"矢量化"。它已经适用于整个向量

最新更新