django 4 的 numpy 警告 - 'numpy.float64'> 类型为零

问题描述 投票:0回答:3

我刚刚更新了 numpy,并且在 Django 中收到以下警告。我该如何解决它?

/usr/local/lib/python3.9/site-packages/numpy/core/getlimits.py:89: 用户警告: 类型的最小次正规值为零。

python django numpy
3个回答
4
投票

就我而言,这是 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


3
投票

当使用通过

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

0
投票

是否是编译器标志问题(-Ofast或-ffast-math),请参阅https://moyix.blogspot.com/2022/09/someones-been-messing-with-my-subnormals.html

© www.soinside.com 2019 - 2024. All rights reserved.