【发布时间】:2017-01-17 06:39:05
【问题描述】:
当我在 Ipython 上执行以下操作时:
test = np.array([1,2,3,4])
test**50
它返回:
array([ 1, -2147483648, -2147483648, -2147483648])
同时具有错误的值和符号。任何线索为什么我可能会得到这个?
【问题讨论】:
-
Numpy 整数的范围有限。当你得到一个非常大的数字(例如,
2**50)时,它会“环绕”并变成负数。这种现象称为溢出。与 Numpy 不同,Python 本身没有这个限制:4**50是 1267650600228229401496703205376。 -
@DYZ ...更准确地说,如您所说,Numpy 类型受效率限制(如您所说,许多类型是有符号类型)。但是 Python 原生的整数对象会自动提升为大整数对象,防止溢出。具体来说,
np.array()构造函数会将 dtype 设置为可以处理提供的初始值的最小尺寸类型。您可以使用关键字参数(选项)dtype=来覆盖它或“向上转换”类型。test = np.array([1,2,3,4], dtype='int')应该会更好。但仍然可能无法处理这种极端情况。 -
(特别是当我用 Python 2.7.17 和 Numpy 1.11.1 测试这个例子时,我得到了大整数的自动提升,显然,一切都很好,大约
test**31...但除此之外,操作会导致:RuntimeWarning:power遇到无效值)。因此,与对原生 Python 大整数的相同操作相比,如此大的幂运算的 Numpy 广播不需要完全透明)。 docs.scipy.org/doc/numpy/reference/arrays.dtypes.html