单元数乘法

时间:2019-01-08 09:45:45

标签: python numpy elementwise-operations

我正在使用Python 3.7和numpy 1.15.2,并且遇到了我不理解的逐元素乘法运算。以下对我来说很直观:

modal

给予

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([[30000 * 70000,40000 * 80000]])。负数从何而来?我应该怎么做才能得到预期的数组?

1 个答案:

答案 0 :(得分:2)

默认情况下,看起来numpy会将纯数字解释为np.int32(范围为-2 31 ... 2 31 -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)