python - 大数的乘积
问题描述
我有两组数字:
- 一个是 2 的幂(1、2、4 等)的“列表”(元组也可以),我称之为 Mult_array。例如,我可以成功地将其定义为长度为 1485,并且我可以检查这些值,以便代码正常工作。我试图以各种形式与他们合作。我可以总结这些“列表”中的所有值并查看结果。
- 第二个可以通过多种方式组成,但现在,它是数据帧中的一行(数据帧由 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 行(带有 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)。