Числовое поэлементное умножение

Я использую Python 3.7 и numpy 1.15.2 и столкнулся с поведением при поэлементном умножении, которое я не понимаю. Следующее интуитивно понятно для меня:

import numpy as np
a = np.array([[30000,4000]])
b = np.array([[70000,8000]])
np.multiply(a,b)

дает

array([[2100000000,32000000]])

Тем не менее, когда я делаю

a = np.array([[30000,40000]])
b = np.array([[70000,80000]])
np.multiply(a,b)

я получил

array([[ 2100000000, -1094967296]])

Я бы предположил, что результатом должен быть массив ([[ 30000*70000, 40000*80000]]). Откуда берется отрицательное число? И что я должен сделать, чтобы получить ожидаемый массив?

1 ответ

Решение

Похоже, что numpy по умолчанию интерпретирует простые числа как np.int32 (который имеет диапазон от -231... 231 - 1), который будет переполнен 40000*80000, так как 3200000000 > 2**31 - 1 (= 2147483647):

import numpy as np

a = np.array([[30000,40000]])
b = np.array([[70000,80000]])
np.multiply(a,b)
Out: array([[ 2100000000, -1094967296]])

type(a[0][0])
Out: numpy.int32

Вы можете решить эту проблему, явно указав более подходящий тип данных:

a = np.array([[30000,40000]], dtype=np.int64)
b = np.array([[70000,80000]], dtype=np.int64)
np.multiply(a,b)
Out: array([[2100000000, 3200000000]], dtype=int64)

или же

a = np.array([[30000,40000]], dtype=np.uint32)
b = np.array([[70000,80000]], dtype=np.uint32)
np.multiply(a,b)
Out: array([[2100000000, 3200000000]], dtype=uint32)
Другие вопросы по тегам