OverflowError: Python int too large to convert to C long when feed data into numpy array
OverflowError: Python int too large to convert to C long when feed data into numpy array
我试图在加密后将大量数字输入一个 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 整数以标准的 32 位或 64 位表示形式存储,具体取决于您的平台。
这意味着虽然最大可表示 Python 整数仅受系统内存限制,但最大可表示 Numpy 整数受 64 位可表示的限制。
您可以在此处查看可表示的最大无符号整数值:
>>> import numpy as np
>>> np.iinfo(np.uint64).max
18446744073709551615
>>> 2 ** 64 - 1
18446744073709551615
适合您的应用程序的最佳方法取决于您要对这些非常大的整数执行的操作,但我倾向于避免使用 Numpy 数组来处理这种大小的整数。
我试图在加密后将大量数字输入一个 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 整数以标准的 32 位或 64 位表示形式存储,具体取决于您的平台。
这意味着虽然最大可表示 Python 整数仅受系统内存限制,但最大可表示 Numpy 整数受 64 位可表示的限制。
您可以在此处查看可表示的最大无符号整数值:
>>> import numpy as np
>>> np.iinfo(np.uint64).max
18446744073709551615
>>> 2 ** 64 - 1
18446744073709551615
适合您的应用程序的最佳方法取决于您要对这些非常大的整数执行的操作,但我倾向于避免使用 Numpy 数组来处理这种大小的整数。