将大量数据存储到 numpy 数组中

Stocking large numbers into numpy array

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

150 ** 28 远远超出了 int64 变量可以表示的范围(它在 8e60 的范围内,而无符号 int64 的最大可能值大约是 18e18)。

Python 可能正在使用任意长度的整数实现,但 NumPy 没有。

正如您正确推断的那样,负数是 int 溢出的症状。

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