首页 > 解决方案 > 大数的乘积

问题描述

我有两组数字:

  1. 一个是 2 的幂(1、2、4 等)的“列表”(元组也可以),我称之为 Mult_array。例如,我可以成功地将其定义为长度为 1485,并且我可以检查这些值,以便代码正常工作。我试图以各种形式与他们合作。我可以总结这些“列表”中的所有值并查看结果。
  2. 第二个可以通过多种方式组成,但现在,它是数据帧中的一行(数据帧由 1485 列组成,比如说 696 行(只是为了具体一点)。值都是 0/1

我想计算 MultArray 和数据帧的点积,并将结果存储在数据帧的新列中。

mult_array2= [1 << i for i in range(BigCourseDF.shape[1])]
BigCourseDF["sortkey"]=BigCourseDF.dot(mult_array2)

range(BigCourseDF.shape[1])很小(比如 45)时,此代码按预期工作。但是,由于mult_array2长度为 1485,此处的第二行会导致类似 OverflowError: int too big to convert 的错误。这是令人沮丧的,因为结果的值应该小于值的总和mult_array2(如果整个数据帧的值都为 1,这就是结果)。

感谢您的帮助,如果需要,我可以提供更多背景信息。

更新:BigCourseDF 的 csv 文件在这里

标签: pythonpandaslargenumber

解决方案


我怀疑您的 BigCourseDF 行(带有 1 和 0 的行)是数据类型 np.float64。如果你用 python int(无限位)数组做矩阵乘法,整数将被转换为 64 位浮点数,这将在 2**1024 附近产生问题:

import numpy as np
bignums = [1<<10, 1<<100, 1<<1022, 1<<1023, 1<<1024]

ones_float = np.ones_like(bignums, dtype=np.float64)
ones_bigint = np.array([1, 1, 1, 1, 1], dtype=object)
ones_int64 = np.array(ones_float, dtype=np.int64)

# this works fine
ones_bigint @ bignums

# this, too
ones_int64 @ bignums

# this gives an error
ones_float @ bignums

因此,您必须将 DataFrame 行转换为上面的 int64 数组,或者使用整个 DataFrame

BigCourseDF_int = BigCourseDF.astype('int64')

(感谢 Mike Tomaino 建议使用 int64)。


推荐阅读