我有一个数据集,我正在尝试应用一些算术方法。 事情是它给了我相对较大的数字,当我用numpy做它们时,它们被存储为0。
奇怪的是,当我计算数字appart时,它们有一个int值,当我使用numpy计算它们时它们只变为零。
x = np.array([18,30,31,31,15])
10*150**x[0]/x[0]
Out[1]:36298069767006890
vector = 10*150**x/x
vector
Out[2]: array([0, 0, 0, 0, 0])
我当然要检查他们的类型:
type(10*150**x[0]/x[0]) == type(vector[0])
Out[3]:True
如何使用numpy计算这个大数字,而不会将它们变成零?
请注意,如果我们在开始时删除因子10,那么问题就会发生变化(但我认为可能是类似的原因):
x = np.array([18,30,31,31,15])
150**x[0]/x[0]
Out[4]:311075541538526549
vector = 150**x/x
vector
Out[5]: array([-329406144173384851, -230584300921369396, 224960293581823801,
-224960293581823801, -368934881474191033])
负数表示python中的int64类型的最大数字是否已经交叉?
答案 0 :(得分:7)
正如Nils Werner已经提到的,numpy的本地ctypes无法保存那么大的数字,但python本身可以,因为int对象使用任意长度的实现。 所以可以做的就是告诉numpy不要将数字转换为ctypes而是使用python对象。这将会变慢,但它会起作用。
In [14]: x = np.array([18,30,31,31,15], dtype=object)
In [15]: 150**x
Out[15]:
array([1477891880035400390625000000000000000000L,
191751059232884086668491363525390625000000000000000000000000000000L,
28762658884932613000273704528808593750000000000000000000000000000000L,
28762658884932613000273704528808593750000000000000000000000000000000L,
437893890380859375000000000000000L], dtype=object)
在这种情况下,numpy数组不会存储数字本身,而是存储对应的int对象。当你执行算术运算时,它们不会在numpy数组上执行,而是在引用后面的对象上执行 我认为你仍然可以使用这种解决方法来使用大多数numpy函数,但它们肯定会比平常慢很多。
但是当你处理大数字时,你会得到什么:D
也许在某个地方有一个库可以更好地处理这个问题。
为了完整起见,如果精度不是问题,你也可以使用浮点数:
In [19]: x = np.array([18,30,31,31,15], dtype=np.float64)
In [20]: 150**x
Out[20]:
array([ 1.47789188e+39, 1.91751059e+65, 2.87626589e+67,
2.87626589e+67, 4.37893890e+32])
答案 1 :(得分:2)
150 ** 28
超出了int64变量可以表示的范围(它在8e60
的大概中,而无符号int64的最大可能值大约为18e18
)。
Python可能正在使用任意长度的整数实现,但NumPy没有。
正确推断,负数是int溢出的症状。