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完全新手教程
Feb 08 Python
Python的Flask框架中@app.route的用法教程
Mar 31 Python
Python内置模块logging用法实例分析
Feb 12 Python
python 将md5转为16字节的方法
May 29 Python
对pandas中to_dict的用法详解
Jun 05 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
python3的输入方式及多组输入方法
Oct 17 Python
python 为什么说eval要慎用
Mar 26 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
python实现代码统计器
Sep 19 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
Python 创建守护进程的示例
Sep 29 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
有关PHP中MVC的开发经验分享
2012/05/17 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
node.js通过url读取文件
2020/10/16 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
HTML的form表单和django的form表单
2019/07/25 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
请说出以下代码输出什么
2013/08/30 面试题
个人自我评价分享
2013/12/20 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
端午节寄语2015
2015/03/23 职场文书
长江七号观后感
2015/06/11 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers