【问题标题】:OverflowError: Python int too large to convert to C long when feed data into numpy array溢出错误:将数据输入 numpy 数组时,Python int 太大而无法转换为 C long
【发布时间】:2021-01-06 12:39:08
【问题描述】:

我试图在加密后将大量数字输入 numpy 数组,但它说数字太长并且溢出。我检查了代码,在将数字输入numpy数组之前一切都正确,但是在输入数据的步骤中出现错误,即en1[i,j] = pk.raw_encrypt(int(test1[i,j]))

我在这里得到的加密号码是3721469428823308171852407981126958588051758293498563443424608937516905060542577505841168884360804470051297912859925781484960893520445514263696476240974988078627213135445788309778740044751099235295077596597798031854813054409733391824335666742083102231195956761512905043582400348924162387787806382637700241133312260811836700206345239790866810211695141313302624830782897304864254886141901824509845380817669866861095878436032979919703752065248359420455460486031882792946889235009894799954640035281227429200579186478109721444874188901886905515155160376705016979283166216642522595345955323818983998023048631350302980936674。 Python3 仍然声称它是一个 int 类型。数字本身没有溢出,但是numpy数组不允许填充。

numpy 的什么属性导致了这个问题,有没有解决这个问题的方法?我考虑过使用 list 来替换 numpy 数组,但是当它不是一维数组时,它会很难实现。我在下面附上了完整的测试代码。

test1 = np.array([[1,2,3],[1,2,4]])
test2 = np.array([[4,1,3],[6,1,5]])

en1 = np.copy(test1)
en2 = np.copy(test2)

pk, sk = paillier.generate_paillier_keypair()

en_sum = np.copy(en1)
pl_sum = np.copy(en1)

for i in range(test1.shape[0]):
    for j in range(test2.shape[1]):
        en1[i,j] = pk.raw_encrypt(int(test1[i,j]))
        en2[i,j] = pk.raw_encrypt(int(test2[i,j]))

        en_sum[i,j] = en1[i,j]*en2[i,j]
        pl_sum[i,j] = sk.raw_decrypt(en_sum[i,j])

sum = sk.raw_decrypt(en_sum)

【问题讨论】:

  • Python 支持任意长度整数的算术运算。但是numpy 是为速度而写的,它的整数是 C 长整数,限制为 32 位,表示范围为 -2,147,483,647 到 +2,147,483,647 的值。您可以尝试将其转换为字符串以使numpy 受益。

标签: python numpy overflow paillier


【解决方案1】:

Python 整数以任意精度存储,而 numpy 整数根据您的平台以标准 32 位或 64 位表示形式存储。

这意味着虽然最大可表示的 Python 整数仅受系统内存限制,但最大可表示的 Numpy 整数受可表示的 64 位整数的限制。

您可以在这里看到最大可表示的无符号整数值:

>>> import numpy as np
>>> np.iinfo(np.uint64).max
18446744073709551615

>>> 2 ** 64 - 1
18446744073709551615

最适合您的应用程序的方法取决于您想对这些非常大的整数做什么,但我倾向于避免使用 Numpy 数组来处理这种大小的整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多