【问题标题】:Numpy is calculating wrong [duplicate]Numpy计算错误[重复]
【发布时间】:2017-04-04 13:58:53
【问题描述】:

我正在使用类似这段代码的 numpy

>>>import numpy as np
>>>a=np.arange(1,100000001).sum()
>>>a
987459712

我猜结果一定是这样的 5000000050000000

我注意到,直到五个数字,结果都可以。 有人知道发生了什么吗?

问候

【问题讨论】:

  • np a=np.arange(1,100000001).sum()
  • 编辑了您的问题以包括正确的代码格式(将代码部分放在新行上并点击ctrl+k
  • 无法在带有 numpy@1.11.2 或 python3.5 和 numpy@1.12.0 的 python 2.7 中重现。你在用什么?
  • 另外,将问题的标题更改为更精确的名称将是一个好主意...
  • 是的,如果你这样做 a=np.arange(1,100000001).sum() 它会给出 5000000050000000 作为结果

标签: python numpy


【解决方案1】:

Numpy 在这里没有做错。这种现象被称为integer overflow

x = np.arange(1,100000001)
print(x.sum())  # 987459712
print(x.dtype)  # dtype('int32')

arange 中用于给定输入的 32 位整数类型根本无法容纳 5000000050000000。最多可以采用 2147483647

如果您明确使用更大的整数或浮点数据类型,您会得到预期的结果。

a = np.arange(1, 100000001, dtype='int64').sum()
print(a)  # 5000000050000000

a = np.arange(1.0, 100000001.0).sum()
print(a)  # 5000000050000000.0

【讨论】:

  • 对我来说听起来像是一个“错误”,尤其是在 Python 中,必要时使用长整数。当然numpy 自己做算术,但作为一个数字包,它应该更擅长处理计算,而不是更糟。
  • @alexis 我不认为这是一个错误,因为它是记录在案的行为。文档说默认情况下arange 从输入推断数据类型。由于100000001 足够小,使用int32 似乎是合理的。实际上,由于我使用 32 位 Python 并主要使用整数数组进行索引,因此我很欣赏它默认使用指针大小的数据类型。
【解决方案2】:

我怀疑您使用的是 Windows,结果的数据类型是 32 位整数(而对于那些使用 Mac OS X 或 Linux 的人来说,数据类型是 64 位)。注意5000000050000000 % (2**32) = 987459712

尝试使用

a = np.arange(1, 100000001, dtype=np.int64).sum()

a = np.arange(1, 100000001).sum(dtype=np.int64)

附:任何不使用 Windows 的人都可以重现如下结果:

>>> np.arange(1, 100000001).sum(dtype=np.int32)
987459712

【讨论】:

  • 很好的观察,这是特定于 Windows 的!
  • 非常感谢您!解决了我的问题!
猜你喜欢
  • 2017-08-29
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2018-01-22
相关资源
最近更新 更多