【问题标题】:A bug of Python's power operator **?Python 的幂运算符 ** 的错误?
【发布时间】:2017-06-06 09:52:24
【问题描述】:

来自以下代码:

import numpy as np

print 2**np.array([32, 33])

我得到了负数 [-2147483648 -2147483648]。我正在使用python 2.6。这是某种错误吗?相反print 2**32给出了正确答案4294967296

【问题讨论】:

  • 你在 Windows 上吗?
  • 是的,我在 Windows 上,但我不确定它是否溢出。当我写 print 2**32 我得到 4294967296
  • 我能问一下为什么您首先猜测的是内置运算符中的错误吗?
  • 做普通的2**32 给出了正确的结果,因为它使用 Python 整数,它可以任意增长(尽管在 Python 2 中大于 CPU 原生整数大小的整数将是 long 而不是int) 。但是 Numpy 被设计为使用固定大小的数字,而不是 Python 整数。
  • @MYGz 即使使用 64 位 Windows 也可能成为问题:stackoverflow.com/a/36279549/2285236

标签: python numpy


【解决方案1】:

这些值太大,无法存储在32-bit int 默认使用的numpy 中。如果您将数据类型设置为float(或64-bit int),您会得到正确的结果:

import numpy as np

print 2 ** np.array([32, 33], dtype=np.float)
# [  4.2946730e+09  8.58993459e+09  ]

print 2 ** np.array([32, 33], dtype=np.int64) # 64-bit int as suggested by PM 2Ring
# [  4294967296  8589934592]

【讨论】:

  • 或者如果你想要精确的整数结果,请使用dtype=np.int64
  • 在没有指定 dtype 的情况下在 Python2.7.6 上正常工作。也许新版本的 numpy 可以处理它?是否与 32 位操作系统有关?
  • @MYGz 当然。 ;) 查看np.array([32, 33]).dtype 打印的内容。当然,也可以在 64 位系统上安装 32 位 Python。
  • @MYGz 我不确定。我已经在 Windows 10 64 位上使用 Python 2.7.9 64 位、numpy 1.9.0 对其进行了测试,并且可以重现 OP 描述的行为。
  • 有趣。我想有一个论点可以使 int32 成为默认类型以保持向后兼容性。但是我没有64位的机器,也不会使用Windows,所以我就闭嘴了。 ;)
【解决方案2】:

这是因为当使用 numpy 时,给出的数字会有一定的大小,例如 32 位或 64 位 int。这些将在给定的计算中溢出,并给出负数。

尝试让它们浮动,它应该会有所帮助:

print 2**np.array([32., 33.])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2016-02-19
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2022-01-27
    • 2011-09-18
    相关资源
    最近更新 更多