我刚刚更新了 numpy,并且在 Django 中收到以下警告。我该如何解决它?
/usr/local/lib/python3.9/site-packages/numpy/core/getlimits.py:89: 用户警告:
类型的最小次正规值为零。
就我而言,这是 opencv 的自定义编译版本和 numpy 1.22 之间的某种兼容性问题。停止警告的解决方法是执行以下操作。
import numpy as np
np.finfo(np.dtype("float32"))
np.finfo(np.dtype("float64"))
import cv2
您可能会发现它的一个变体会抑制您的警告。
我已经用 numpy 提交了一份错误报告,但我不确定它是否容易弄清楚。 https://github.com/numpy/numpy/issues/20895
当使用通过
numpy 1.22.1
安装的 pip
和从源代码编译的 opencv 4.5.3
时,我在虚拟环境中收到相同的警告。有趣的是,在 anaconda 环境中使用完全相同的软件包版本(从 conda/conda-forge 安装)不会产生警告。
根据@Peter's bug报告中的讨论,opencv修改了numpy,以便用零替换非常小的值。因此,警告是有用的,并且可能是预期的行为:
OpenCV 有将浮点处理设置为“flush”的习惯 到零”。这样做有一个很好的理由:冲洗到 零要快得多,你失去的只是非常小的值(我有 一些扩散模拟曾经速度非常慢 如果活动停止,因为系统几乎一直在计算这些 0 值)。
老实说,我认为他们已经做了一些事情,但我们没有 问题已经打开很长时间了;)...看来这甚至是 不过,在次正常 == 0 的情况下,先将次正常刷新为零 比较(即使它正确返回)。
坦白说,在这里给你一个警告从某种意义上来说正是它的目的 目的。该值可能不为零,但由于以下原因而被视为零 cv2 import 与 NumPy 混淆。所以使用最小的次正规将是 由于 import cv2,在许多情况下毫无意义。
@Peter 的解决方案并没有消除我的 numpy 警告,但降级到 numpy 1.21 却做到了。
pip install numpy==1.21
是否是编译器标志问题(-Ofast或-ffast-math),请参阅https://moyix.blogspot.com/2022/09/someones-been-messing-with-my-subnormals.html