【问题标题】:Seemingly inconsistent RuntimeWarning using numpy arange使用 numpy arange 看似不一致的 RuntimeWarning
【发布时间】:2020-09-14 15:03:35
【问题描述】:

当我的朋友运行以下代码时,它会发出 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。

【问题讨论】:

  • 首先使用print() 查看arange()range() 的值。
  • 同样的问题 W10 x64 Python 3.7
  • 它在 LInux Mint(64 位)、Python 3.7.7(64 位)、numpy 1.18.4(没有 Anaconda)上都能正常工作。相同的 Python 2.7.17(64 位),numpy 1.16.6 你在两台电脑上都使用64-bit Python 吗?
  • @furas 刚刚检查过。我们都在使用64-bit Python。
  • @furas 打印似乎为 arange() 和 range() 显示相同的值,当然只是将 arange() 作为一个 numpy 数组。

标签: python numpy warnings


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这确实解释了她的问题。但我不明白为什么我没有看到相同的行为。使用相同版本的 numpy,为什么 numpy 会明显推断出我和我朋友之间的不同数据类型?
  • @L.N.M 你得到了什么价值?
  • 1.6449330668487263 @DrBwts
  • 我必须承认这很奇怪。对于 W10 x64 机器,默认值应为 int32,即 c long int,而不是您的机器似乎正在使用的 c long long int
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2011-06-27
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多