首页 > 解决方案 > 使用 numpy arange 看似不一致的 RuntimeWarning

问题描述

当我的朋友运行以下代码时,它会给出 RuntimeWarning 并返回“inf”。但是,如果我运行相同的代码,它会在没有警告的情况下执行并返回一个值。

import numpy as np
total = 0
k = 10**6
arr = np.arange(k, 0, -1)
for i in arr:
    total += 1/(i**2)
print(total)

这是她的输出:

\Anaconda3\lib\site-packages\ipykernel_launcher.py:7: RuntimeWarning: divide by zero encountered in long_scalars
  import sys
inf

用内置的 range() 替换 np.arange() 解决了这个问题,她得到了和我一样的输出。

我的问题是:是什么导致她的输出和我的输出不一致?此外,为什么她在使用 np.arange 和 range 时会看到不同,而对我来说输出是一样的?

我们都通过 Anaconda 使用 python 3.7.4,在 64 位 Windows 10 上使用 numpy 1.16.5。

标签: pythonnumpywarnings

解决方案


它与创建时 Numpy 推断出的数据类型有关arr。对我来说,Numpy 推断我想要np.int32& 只是不足以容纳 (10**6)**2 所以你最终得到一个inf值。

如果您明确声明数据类型,np.float64则问题会自行解决。

arr = np.arange(k, 0, -1, dtype=np.float64)

推荐阅读