将大量存入numpy数组


问题内容

我有一个数据集,我正尝试在该数据集上应用某种算术方法。问题是它给了我相对较大的数字,当我使用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类型的最大数,不是吗?


问题答案:

正如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])