我正在使用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]])。负数来自哪里?我该怎么做才能得到预期的阵列?
看起来numpy默认将普通数字解释为np.int32(范围从-2 31 ... 2 31 - 1),这将溢出4000080000,因为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(a0)
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)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。