В чем проблема np.свертки с 10**9?

#python #numpy #digits

Вопрос:

Доброе утро, когда я использую приведенный ниже код, я получаю неправильный результат

 import numpy as np
print(np.convolve([10**9], [ 10**9]))
 

Я получаю:-1486618624, в то время как я должен получать: (10 в степени 9) * (10 в степени 9) = (10 в степени 18)

Как я могу преодолеть эту проблему? Очень любопытно, что я получаю правильный результат, используя:

 print(np.convolve([10**10], [ 10**8]))
 

что дает мне 1000000000000000000

в то время как когда я делаю:

 print(np.convolve([10], [ 10**9]))
 

Я снова получаю глупый результат, например 1410065408, а не 10 в степени 10. Похоже, что каждый раз, когда есть 10 в степени 9, я получаю странные результаты.
Спасибо

Ответ №1:

Обратите 10**9 внимание, что это целое число , которое в numpy интерпретируется как int32 32-разрядное целое число. Максимальное значение , которое может быть представлено в этом типе 2147483647 , заключается в том, что если вы идете медленнее, чем это, вы получаете переполнение. Если вы хотите использовать целочисленные типы, используйте np.int64 вместо этого, в противном случае используйте числа с плавающей запятой, например np.float :

 np.convolve(np.array([10**9], dtype=np.int64), np.array([10**9], dtype=np.int64))
 

Комментарии:

1. Спасибо. Тогда почему это работает с 10**10? И как я могу это исправить?

2. Если вы используете 10**10 его, он будет создавать int64 массивы с самого начала. Попробуйте сами: выведите np.array([x]).dtype для различных значений x . Также ознакомьтесь с документацией: numpy.org/doc/stable/user/basics.types.html