使用 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
与我的例子类似。