在python 3.5

时间:2017-03-02 13:57:03

标签: python arrays numpy

我习惯了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)会出现溢出问题。似乎可能存在许多情况,当在数组上进行数学运算时,可能会陷入溢出整数的陷阱。我想知道是否有办法避免这个问题?

1 个答案:

答案 0 :(得分:1)

不,没有办法避免这个问题,因为numpy deliberatly不检查某些算术运算中的溢出,因为它更快不检查。一般来说,你需要注意你在numpy中代表什么样的对象。

但是你可以强制使用object - 数组来获取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])