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