为什么 numpy.vectorize 在使用不确定性时会发出有关无效值的警告?

2023-11-29

使用 Python 3.10、numpy 1.23.5 和不确定性3.1.7(在 Linux 上;特别是在 Fedora 37 上使用 conda-forge 的软件包),代码如下:

import numpy as np
from uncertainties.core import Variable


x = np.array([1.0, 2.0])
y = np.array([np.nan, np.nan], dtype=float)
func = np.vectorize(lambda x, y: Variable(x, y), otypes=[object])
func(x, y)

产生:

/lib/python3.10/site-packages/numpy/lib/function_base.py:2411: RuntimeWarning: invalid value encountered in <lambda> (vectorized)
  outputs = ufunc(*inputs)

Using warnings.simplefilter("error"),我得到以下回溯:

Traceback (most recent call last):
  File "/test.py", line 12, in <module>
    z = func(x, y)
  File "/lib/python3.10/site-packages/numpy/lib/function_base.py", line 2328, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "/lib/python3.10/site-packages/numpy/lib/function_base.py", line 2411, in _vectorize_call
    outputs = ufunc(*inputs)
RuntimeWarning: invalid value encountered in <lambda> (vectorized)

如果我更改输入以使用所有有限浮点数,如下所示:

import numpy as np
from uncertainties.core import Variable


x = np.array([1.0, 2.0])
y = np.array([1.0, 1.0], dtype=float)
func = np.vectorize(lambda x, y: Variable(x, y), otypes=[object])
func(x, y)

或更改代码以使用自定义类而不是Variable像这样:

import numpy as np


class Variable:
    def __init__(self, x, y):
        self.x = x
        self.y = y


x = np.array([1.0, 2.0])
y = np.array([np.nan, np.nan], dtype=float)
func = np.vectorize(lambda x, y: Variable(x, y), otypes=[object])
func(x, y)

那么不会发出任何警告。

numpy 发出此警告的原因是什么?它来自 pdb 无法介入的编译代码。我在不确定性代码中没有看到任何内容Variable这应该会出错,或者与标准 Python 类(如我的第三个示例)不同。

我注意到这段代码:

import numpy as np
from uncertainties.core import Variable


x = np.array([1.0, 2.0])
y = np.array([np.nan, np.nan], dtype=float)
[Variable(ix, iy) for ix, iy in zip(x, y)]

不会产生错误,因此将这些参数传递给实际上并不存在问题Variable。 numpy 似乎正在检查向量化函数参数的类型或维度,并检测到与预期不符的内容。

在这里我尝试提供一个简单的调用numpy.vectorize。我遇到这个问题的实际案例是不确定性.unumpy.uarray它使用numpy.vectorize与我的例子类似。


看看不确定性的来源。您会发现它通过语句检查提供的不确定性是否为负std_dev < 0.

您提供的不确定性(std_dev在代码中)是 NaN。这通常没问题。跑步np.nan < 0应该永远是False根据 IEEE745,并且不应该是错误。

但是当在一个内部进行比较时np.fromfunc发出警告。和np.vectorize calls fromfunc在引擎盖下。为什么会失败?我不知道。我可以做的最简单的复制:

import numpy as np
np.seterr(all='raise')
func = np.frompyfunc(lambda x: x<0,nin=1,nout=1)
func(1)            # is ok
func(np.nan)       # is not ok

我建议您跳过矢量化,并进行列表理解。我想它会提供合理的速度,并且您可以解决这个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 numpy.vectorize 在使用不确定性时会发出有关无效值的警告? 的相关文章

随机推荐