numpy数据溢出
- 1.python 3 的整数上限和 python 2 的整数上限
- 1.1 python 2的整数范围
- 1.2 python 3 的整数范围
- 2. numpy数值表示
- 2.1 那么numpy支持的数据类型和 python有什么不同了
- 2.2 如何解决整数溢出问题
- 总结
- 实验一:使用 numpy库来表示正数
import numpy as np
E = [1,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009]
F = [2,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019]
G = [3,208378,144703,73205,52363,100014,196058,204444,20,5035,1458]
H = [4,399719,15736,7589,258746,30968,1457820,211272,1402,103476,1458]
# 使用numpy.array 方法将 tuple的数据转换为 ndarray
Q = np.array([E,F])
W = np.array([G,H])
# 将数组对应的序列相乘
print(W*Q)
结果打印的值如下:
我们可以看到,两个正整数数组里面的数值相乘,竟然会出现负数(如:E[1] * G[1] 100000*208378)
- 实验二 : 使用python 直接表示正数
发现 100000*208378又是可以正常通过 python解释器的。
# 使用 python 来表示整数
print(100000*208378) # 打印结果:20837800000
是不是感到很无语!为什么同样的 数值 做乘法在 nump 库下会出现 负数(数据溢出) , 但是在 python下就是正常的了 ?
在开始讨论这个话题之前,我们先引出下面两个话题
- python 3 中的整数上限是多少 ? python 2 的了 ?
- Numpy 中的整数上限是多少 ?整数溢出该怎么办 ?
1.python 3 的整数上限和 python 2 的整数上限
1.1 python 2的整数范围
- 一种是短整数,也即常说的整数,用 int 表示,有个内置函数 int() 大小有限,可通过 sys.maxint() 查看。
- 一种是长整数,即大小无限的整数,用 long 表示,有个内置函数 long() 。写法在数字后面加 大写字母 L 或小写 字母 l 如 : 1000L 。
- 当一个整数超出短整数范围时,它会自动采用长整数来表示。
1.2 python 3 的整数范围
- python 3 情况就没有 python 2 那么复杂,它仅有一种内置的整数,表示为 int , 形式上是 python 2 的短整数,但实际上它能表示的范围无限,行为上更像长整数,无论多大的数结尾均不需要加 字母 L 做区分。
- 也就是P ython 3 中的整数无上限,只要不超出内存空间即可。这就解释了 前文中 直接打印两数相乘,为什么结果会是正确的。
2. numpy数值表示
numpy 由于它是 C语言实现的,在整数表示上,用的是C语言的规则,也就是会区分 整数和长整数,下面我们查看下
这也就是说: numpy 默认的整数 int 是 32位,表示的范围 : -2147483648 ~ 2147483647
2.1 那么numpy支持的数据类型和 python有什么不同了
首先:Numpy 支持的数据类型要比 python的多,相互间的区分界限有很多样:数据来源
Numpy数据类型
2.2 如何解决整数溢出问题
我们可以通过指定 dtype 的方式来解决 ,fllowing the code
# 使用 python 来表示整数
print(100000*208378)
import numpy as np
p = [100000]
q = [500000]
# 一个溢出的例子
a = np.array(p)
b = np.array(q)
print(a*b) # 产生溢出,结果就是个和奇怪的值
# 如何解决
c = np.array(p,dtype = 'int64')
d = np.array(q,dtype = 'int64')
print(c*d) # 没有溢出:正常打印 50000000000
总结
- Python 3 极大的简化了整数的表示,效果可描述为:整数就只有一种整数 int , 没有其他类型的整数 (long , int8 , int64 )之类的
- Numpy 中的整数类型对应于 C语言的数据类型,每种“整数”都有自己的空间,要解决数据溢出的问题,需要指定更大的数据类型 dtype