为何含np.arcsin的代码触发RuntimeWarning: invalid value encountered in arcsin?
问题描述
我编写了如下代码:
import numpy as np def f(x,y): t = np.where(x==0, 0, x/y) return np.where(abs(t)<=1, np.arcsin(t), np.NaN) npts = 500 x = np.linspace(-10,10, npts) y = np.linspace(-10,10, npts) x, y = np.meshgrid(x, y) z = f(x,y)
运行时收到警告:
RuntimeWarning: invalid value encountered in arcsin
不清楚该警告产生的原因,希望得到解答。
原因分析
这是np.where的执行逻辑导致的:它会先计算所有传入的参数表达式,再根据条件选择对应的值。也就是说,即使你写了np.where(abs(t)<=1, np.arcsin(t), np.NaN),程序会先对整个t数组执行np.arcsin(t)计算——包括那些abs(t)>1的元素,而arcsin函数的定义域是[-1,1],超出这个范围的输入会产生无效值,进而触发警告。虽然最后这些无效值会被NaN替换,但计算过程已经发生,所以警告无法避免。
解决方案
可以先把t中超出[-1,1]范围的元素替换为NaN,再执行arcsin计算,这样就不会触发警告:
方法一:直接修改数组
import numpy as np def f(x,y): t = np.where(x==0, 0, x/y) # 先把超出范围的元素设为NaN t[abs(t) > 1] = np.NaN return np.arcsin(t) npts = 500 x = np.linspace(-10,10, npts) y = np.linspace(-10,10, npts) x, y = np.meshgrid(x, y) z = f(x,y)
方法二:使用掩码分区域计算
import numpy as np def f(x,y): t = np.where(x==0, 0, x/y) # 创建掩码标记有效范围 valid_mask = abs(t) <= 1 # 初始化结果数组为NaN result = np.full_like(t, np.NaN) # 只对有效区域计算arcsin result[valid_mask] = np.arcsin(t[valid_mask]) return result npts = 500 x = np.linspace(-10,10, npts) y = np.linspace(-10,10, npts) x, y = np.meshgrid(x, y) z = f(x,y)
内容的提问来源于stack exchange,提问作者Abdul Suleman
相关产品推荐
相关产品推荐

