Python整数与Numpy数据溢出问题解决


Posted in Python onSeptember 11, 2019

某位 A 同学发了我一张截图,问为何结果中出现了负数?

Python整数与Numpy数据溢出问题解决

看了图,我第一感觉就是数据溢出了。数据超出能表示的最大值,就会出现奇奇怪怪的结果。

然后,他继续发了张图,内容是 print(100000*208378),就是直接打印上图的 E[0]*G[0],结果是 20837800000,这是个正确的结果。

所以新的问题是:如果说上图的数据溢出了,为何直接相乘的数却没有溢出?

由于我一直忽视数据的表示规则(整型的上限是多少?),而且对 Numpy 了解不多,还错看了图中结果,误以为每一个数据都是错误的,所以就解答不出来。

最后,经过学习群里的一番讨论,我才终于明白是怎么回事,所以本文把相关知识点做个梳理。

在正式开始之前,先总结一下上图会引出的话题:

  • Python 3 中整数的上限是多少?Python 2 呢?
  • Numpy 中整数的上限是多少?出现整数溢出该怎么办?

关于第一个问题,先看看 Python 2,它有两种整数:

  • 一种是短整数,也即常说的整数,用 int 表示,有个内置函数 int()。其大小有限,可通过sys.maxint() 查看(取决于平台是 32 位还是 64 位)
  • 一种是长整数,即大小无限的整数,用 long 表示,有个内置函数 long()。写法上是在数字后面加大写字母 L 或小写的 l,如 1000L

当一个整数超出短整数范围时,它会自动采用长整数表示。举例,打印 2**100 ,结果会在末尾加字母 L 表示它是长整数。

但是到了 Python 3,情况就不同了:它仅有一种内置的整数,表示为 int,形式上是 Python 2 的短整数,但实际上它能表示的范围无限,行为上更像是长整数。无论多大的数,结尾都不需要字母 L 来作区分。

也就是说,Python 3 整合了两种整数表示法,用户不再需要自行区分,全交给底层按需处理。

理论上,Python 3 中的整数没有上限(只要不超出内存空间)。这就解释了前文中直接打印两数相乘,为什么结果会正确了。

PEP-237(Unifying Long Integers and Integers)中对这个转变作了说明。它解释这样做的 目的:

这会给新的 Python 程序员(无论他们是否是编程新手)减少一项上手前要学的功课。

Python 在语言运用层屏蔽了很多琐碎的活,比如内存分配,所以,我们在使用字符串、列表或字典等对象时,根本不用操心。整数类型的转变,也是出于这样的便利目的。(坏处是牺牲了一些效率,在此就不谈了)

回到前面的第二个话题:Numpy 中整数的上限是多少?

由于它是 C 语言实现,在整数表示上,用的是 C 语言的规则,也就是会区分整数和长整数。

有一种方式可查看:

import numpy as np
a = np.arange(2)
type(a[0])
# 结果:numpy.int32

也就是说它默认的整数 int 是 32 位,表示范围在 -2147483648 ~ 2147483647。

对照前文的截图,里面只有两组数字相乘时没有溢出:100007*4549、100012*13264,其它数据组都溢出了,所以出现奇怪的负数结果。

Numpy 支持的数据类型要比 Python 的多,相互间的区分界限很多样:

Python整数与Numpy数据溢出问题解决

截图来源:https://www.runoob.com/numpy/numpy-dtype.html

要解决整数溢出问题,可以通过指定 dtype 的方式:

import numpy as np
q = [100000]
w = [500000]
# 一个溢出的例子:
a = np.array(q)
b = np.array(w)
print(a*b) # 产生溢出,结果是个奇怪的数值
# 一个解决的例子:
c = np.array(q, dtype='int64')
d = np.array(w, dtype='int64')
print(c*d) # 没有溢出:[50000000000]

好了,前面提出的问题就回答完了。来作个结尾吧:

  • Python 3 极大地简化了整数的表示,效果可表述为:整数就只有一种整数(int),没有其它类型的整数(long、int8、int64 之类的)
  • Numpy 中的整数类型对应于 C 语言的数据类型,每种“整数”有自己的区间,要解决数据溢出问题,需要指定更大的数据类型(dtype)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python编写简单的定时器的方法
May 02 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
浅谈python新式类和旧式类区别
Apr 26 Python
python学习开发mock接口
Apr 28 Python
java判断三位数的实例讲解
Jun 10 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
利用python在excel中画图的实现方法
Mar 17 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
Python中的__init__作用是什么
Jun 09 Python
用python绘制樱花树
Oct 09 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 #Python
用Python画一个LinkinPark的logo代码实例
Sep 10 #Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 #Python
django drf框架自带的路由及最简化的视图
Sep 10 #Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 #Python
python3.7环境下安装Anaconda的教程图解
Sep 10 #Python
Windows10下 python3.7 安装 facenet的教程
Sep 10 #Python
You might like
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PHP扩展开发教程(总结)
2015/11/04 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
初学Python实用技巧两则
2014/08/29 Python
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
python实现flappy bird小游戏
2018/12/24 Python
Python中logging实例讲解
2019/01/17 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
Python中的全局变量如何理解
2020/06/04 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
J2EE面试题大全
2016/08/06 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
教室布置标语
2014/06/26 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
2014年评职称工作总结
2014/11/20 职场文书
世界文化遗产导游词
2015/02/13 职场文书