OverflowError: Python слишком велик для преобразования в C long при подаче данных в массив numpy
Я пытаюсь передать большое число после шифрования в массив numpy, но он говорит, что число слишком длинное, и оно переполняется. Я проверил код, все правильно, прежде чем я загрузил числа в массив numpy, но получил ошибку на этапе ввода данных, что
en1[i,j] = pk.raw_encrypt(int(test1[i,j]))
.
Зашифрованный номер, который у меня есть, это
3721469428823308171852407981126958588051758293498563443424608937516905060542577505841168884360804470051297912859925781484960893520445514263696476240974988078627213135445788309778740044751099235295077596597798031854813054409733391824335666742083102231195956761512905043582400348924162387787806382637700241133312260811836700206345239790866810211695141313302624830782897304864254886141901824509845380817669866861095878436032979919703752065248359420455460486031882792946889235009894799954640035281227429200579186478109721444874188901886905515155160376705016979283166216642522595345955323818983998023048631350302980936674
. Python3 по-прежнему утверждает, что это тип int. Само число не получило переполнения, но массив numpy не позволяет его заполнить.
Какое свойство numpy вызвало это и есть ли решение этой проблемы? Я рассматривал возможность использования списка для замены массива 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)
1 ответ
Целые числа Python хранятся с произвольной точностью, в то время как целые числа numpy хранятся в стандартных 32-битных или 64-битных представлениях в зависимости от вашей платформы.
Это означает, что в то время как максимальное представимое целое число Python ограничено только вашей системной памятью, максимальное представимое целое число Numpy ограничено тем, что может быть представлено в 64-битах.
Вы можете увидеть максимальное представимое беззнаковое целое значение здесь:
>>> import numpy as np
>>> np.iinfo(np.uint64).max
18446744073709551615
>>> 2 ** 64 - 1
18446744073709551615
Лучший подход для вашего приложения зависит от того, что вы хотите делать с этими чрезвычайно большими целыми числами, но я бы склонялся к тому, чтобы избегать массивов Numpy для целых чисел такого размера.