大量的产品

product of large numbers

我有两组数字:

  1. 一个是 2 的幂(1、2、4 等)的 "list"(元组也适用), 我称之为 Mult_array。我可以成功地将其定义为 例如,长度为 1485,我可以检查这些值,所以 该代码正在运行。我曾尝试在各种方面与他们合作 格式。我可以总结这些 "lists" 中的所有值并查看 结果。
  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,这就是结果)。

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

更新:csv file of BigCourseDF here

我怀疑您的 BigCourseDF 行(包含 1 和 0 的行)的数据类型为 np.float64。如果你用 python int(无限位)数组进行矩阵乘法,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)。