【问题标题】:Avoiding Overflow in python 3.5在 python 3.5 中避免溢出
【发布时间】:2017-03-02 13:57:03
【问题描述】:

我习惯了 Matlab,所以当我想在 Python 中创建一个10**j 的数组时,其中j 是一个整数,我使用以下代码:

import numpy as np
a=np.array(range(11))
b=10**a

但是我的机器给了我以下输出:

array([          1,          10,         100, ...,   100000000,
    1000000000, -2147483648], dtype=int32)

最后一个条目显然是错误的。现在,我知道我可以做到以下几点

b=np.array([10**k for k in range(11)])

这给出了正确答案,所以我猜问题出在numpy函数array(当然,我可以通过将a保存为int64整数来避免这个问题,但是会有溢出问题更大的j)。似乎在很多情况下,在对数组进行数学运算时,可能会陷入整数溢出的陷阱。我想知道是否有办法避免这个问题?

【问题讨论】:

  • 注意你也可以使用np.arange(11, dtype='int32')
  • 你不能使用花车有什么原因吗?这通常是处理具有少量有效数字的大指数时的解决方案。
  • 谢谢!我没想到……我真傻。

标签: python arrays numpy


【解决方案1】:

不,实际上没有办法避免这个问题,因为 numpy 故意不检查某些算术运算中的溢出,因为不检查会更快。一般你需要注意你在numpy中代表的是什么类型的对象。

但是您可以强制使用 object-array 来获取 Python 行为:

>>> import numpy as np
>>> a = np.array(range(15), object)   
>>> # Note: You could also use "a = np.arange(15, dtype=object)" instead! Thanks @TheBlackCat
>>> b = 10 ** a
>>> b
array([1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,
       1000000000, 10000000000, 100000000000, 1000000000000,
       10000000000000, 100000000000000], dtype=object)

请注意,object 数组很慢,只有在您不需要完整的 numpy 速度和功能时才应使用。

在您的具体情况下,您还可以使用np.float_power-ufunc:

b = np.float_power(10, a)
b
array([  1.00000000e+00,   1.00000000e+01,   1.00000000e+02,
         1.00000000e+03,   1.00000000e+04,   1.00000000e+05,
         1.00000000e+06,   1.00000000e+07,   1.00000000e+08,
         1.00000000e+09,   1.00000000e+10,   1.00000000e+11,
         1.00000000e+12,   1.00000000e+13,   1.00000000e+14])

【讨论】:

  • 你也可以使用np.arange(15, dtype='object')
  • @TheBlackCat 你是对的!我刚刚复制并修改了问题中的代码。我会编辑答案。
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多