Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用np.where时,Numpy将显示更多有关警告的详细信息_Python_Numpy_Pycharm - Fatal编程技术网

Python 在使用np.where时,Numpy将显示更多有关警告的详细信息

Python 在使用np.where时,Numpy将显示更多有关警告的详细信息,python,numpy,pycharm,Python,Numpy,Pycharm,我正在使用numpy(np.where)计算空间数据数组上的一些指标(相当复杂的公式)。有时,当我对它们进行操作时,会收到如下警告: RuntimeWarning: overflow encountered in exp mo_arr = np.where(self.p > 0.5, mo+42.5*(self.p - 0.5)*np.exp(-100.0/(251.0-mo))*(1.0 - np.exp(-6.93/(self.p - 0.5))), mo) 是否有任何简单的方法

我正在使用numpy(
np.where
)计算空间数据数组上的一些指标(相当复杂的公式)。有时,当我对它们进行操作时,会收到如下警告:

RuntimeWarning: overflow encountered in exp
  mo_arr = np.where(self.p > 0.5, mo+42.5*(self.p - 0.5)*np.exp(-100.0/(251.0-mo))*(1.0 - np.exp(-6.93/(self.p - 0.5))), mo)
是否有任何简单的方法可以获取导致警告的字段的x,y,或者我必须重构大量代码块来手动遍历数组才能提取这样的信息

第二个问题:我可以强制
np.where()
处理
float128
?没有
dtype=
选项


第三个问题:当它溢出inplus时,我能强制它设置给定的值吗?如果它溢出inplus,我能强制它减去该值吗

mo+42.5*(self.p-0.5)*np.exp(-100.0/(251.0-mo))*(1.0-np.exp(-6.93/(self.p-0.5)))
正是在计算这个时,您得到了溢出。这发生在计算
np.where()
之前。当
np.exp()
的结果大于最大浮点值时,就会发生溢出。假设双精度(默认值),这是
1.7976931348623157e+308
(可通过
np.nextafter(np.inf,0)
找到),其自然日志约为
709.8
。因此
np.exp(709)
可以,而
np.exp(710)
溢出并返回
np.inf
作为结果(试试!)

要找到罪魁祸首,只需检查
np.exp()
的哪些参数大于
709
。由于您有两个
np.exp()
,请执行以下操作

a=-100.0/(251.0-mo)
b=-6.93/(自我评价-0.5)
a_bad_index=np,其中(a>709)[0]
b_bad_指数=np,其中(b>709)[0]
打印('Bad a:',a[a_Bad_索引],'with INDEX',a_Bad_索引)
打印('Bad b:',b[b_Bad_索引],'with INDEX',b_Bad_索引)
问题2 请注意,
np.where()
float128
上运行良好。要使用
float128
进行计算,您的
self.p
mo
需要是
float128
。然后,
np.exp()
将考虑这一点

问题3 您可以让溢出发生,然后将所有(正或负)无限元素设置为其他值。使用
np.isinf
进行检查。或者,您可以在溢出之前通过对非幂次数据执行709检查来操作数据。

与您的一样,您可以使用
np.errstate来消除警告:

with np.errstate(divide = 'ignore', over = 'ignore'):
    mo_arr = np.where(self.p > 0.5, mo+42.5*(self.p - 0.5)*np.exp(-100.0/(251.0-mo))*(1.0 - np.exp(-6.93/(self.p - 0.5))), mo)
现在只需查找数组不是有限的位置(溢出将有
np.inf
输出):


首先,在单独的行上计算3个参数
其中
仅根据第一个真/假值分配元素。
mo
self.p
的范围是什么?很难说。。。我的意思是,它是一些复杂的数学公式中的值,基于成千上万的10000x1000px空间图像,self.p就像max 100,min 0不是1.0-inf==-inf。对问题是什么?不知道,还是不知道。isfinite()我想,我想找出不是无穷大,而是某个大数字的情况。。。它是否可能生成例如float128而不是无穷大,然后溢出float64?或者它最终也是inf?
np.exp
将溢出任何类型的
float
,如果参数相对较大,甚至
float128
。您可能希望查找
mo-251.0
0.5-self.p
非常小且为正的位置,因为在那里您将溢出-
np.exp(-np.inf)
不会溢出,它只会变为
0.0
ok,这是特定于具体情况的,但我想我的问题的答案是,在这种情况下,没有办法在警告中输出mo_arr的“坐标”,对吗?@FlashThunder没有重写发出警告的内部NumPy代码。很遗憾,这应该已经实现了
bad_coords = np.where(~np.isfinite(mo_arr))