最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python整數(shù)與Numpy數(shù)據(jù)溢出問題解決

 更新時間:2019年09月11日 08:24:31   作者:豌豆花下貓  
這篇文章主要介紹了Python 的整數(shù)與 Numpy 的數(shù)據(jù)溢出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

某位 A 同學(xué)發(fā)了我一張截圖,問為何結(jié)果中出現(xiàn)了負(fù)數(shù)?

看了圖,我第一感覺就是數(shù)據(jù)溢出了。數(shù)據(jù)超出能表示的最大值,就會出現(xiàn)奇奇怪怪的結(jié)果。

然后,他繼續(xù)發(fā)了張圖,內(nèi)容是 print(100000*208378),就是直接打印上圖的 E[0]*G[0],結(jié)果是 20837800000,這是個正確的結(jié)果。

所以新的問題是:如果說上圖的數(shù)據(jù)溢出了,為何直接相乘的數(shù)卻沒有溢出?

由于我一直忽視數(shù)據(jù)的表示規(guī)則(整型的上限是多少?),而且對 Numpy 了解不多,還錯看了圖中結(jié)果,誤以為每一個數(shù)據(jù)都是錯誤的,所以就解答不出來。

最后,經(jīng)過學(xué)習(xí)群里的一番討論,我才終于明白是怎么回事,所以本文把相關(guān)知識點(diǎn)做個梳理。

在正式開始之前,先總結(jié)一下上圖會引出的話題:

  • Python 3 中整數(shù)的上限是多少?Python 2 呢?
  • Numpy 中整數(shù)的上限是多少?出現(xiàn)整數(shù)溢出該怎么辦?

關(guān)于第一個問題,先看看 Python 2,它有兩種整數(shù):

  • 一種是短整數(shù),也即常說的整數(shù),用 int 表示,有個內(nèi)置函數(shù) int()。其大小有限,可通過sys.maxint() 查看(取決于平臺是 32 位還是 64 位)
  • 一種是長整數(shù),即大小無限的整數(shù),用 long 表示,有個內(nèi)置函數(shù) long()。寫法上是在數(shù)字后面加大寫字母 L 或小寫的 l,如 1000L

當(dāng)一個整數(shù)超出短整數(shù)范圍時,它會自動采用長整數(shù)表示。舉例,打印 2**100 ,結(jié)果會在末尾加字母 L 表示它是長整數(shù)。

但是到了 Python 3,情況就不同了:它僅有一種內(nèi)置的整數(shù),表示為 int,形式上是 Python 2 的短整數(shù),但實(shí)際上它能表示的范圍無限,行為上更像是長整數(shù)。無論多大的數(shù),結(jié)尾都不需要字母 L 來作區(qū)分。

也就是說,Python 3 整合了兩種整數(shù)表示法,用戶不再需要自行區(qū)分,全交給底層按需處理。

理論上,Python 3 中的整數(shù)沒有上限(只要不超出內(nèi)存空間)。這就解釋了前文中直接打印兩數(shù)相乘,為什么結(jié)果會正確了。

PEP-237(Unifying Long Integers and Integers)中對這個轉(zhuǎn)變作了說明。它解釋這樣做的 目的:

這會給新的 Python 程序員(無論他們是否是編程新手)減少一項上手前要學(xué)的功課。

Python 在語言運(yùn)用層屏蔽了很多瑣碎的活,比如內(nèi)存分配,所以,我們在使用字符串、列表或字典等對象時,根本不用操心。整數(shù)類型的轉(zhuǎn)變,也是出于這樣的便利目的。(壞處是犧牲了一些效率,在此就不談了)

回到前面的第二個話題:Numpy 中整數(shù)的上限是多少?

由于它是 C 語言實(shí)現(xiàn),在整數(shù)表示上,用的是 C 語言的規(guī)則,也就是會區(qū)分整數(shù)和長整數(shù)。

有一種方式可查看:

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

也就是說它默認(rèn)的整數(shù) int 是 32 位,表示范圍在 -2147483648 ~ 2147483647。

對照前文的截圖,里面只有兩組數(shù)字相乘時沒有溢出:100007*4549、100012*13264,其它數(shù)據(jù)組都溢出了,所以出現(xiàn)奇怪的負(fù)數(shù)結(jié)果。

Numpy 支持的數(shù)據(jù)類型要比 Python 的多,相互間的區(qū)分界限很多樣:

截圖來源:https://www.runoob.com/numpy/numpy-dtype.html

要解決整數(shù)溢出問題,可以通過指定 dtype 的方式:

import numpy as np
q = [100000]
w = [500000]
# 一個溢出的例子:
a = np.array(q)
b = np.array(w)
print(a*b) # 產(chǎn)生溢出,結(jié)果是個奇怪的數(shù)值
# 一個解決的例子:
c = np.array(q, dtype='int64')
d = np.array(w, dtype='int64')
print(c*d) # 沒有溢出:[50000000000]

好了,前面提出的問題就回答完了。來作個結(jié)尾吧:

  • Python 3 極大地簡化了整數(shù)的表示,效果可表述為:整數(shù)就只有一種整數(shù)(int),沒有其它類型的整數(shù)(long、int8、int64 之類的)
  • Numpy 中的整數(shù)類型對應(yīng)于 C 語言的數(shù)據(jù)類型,每種“整數(shù)”有自己的區(qū)間,要解決數(shù)據(jù)溢出問題,需要指定更大的數(shù)據(jù)類型(dtype)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例

    Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例

    這篇文章主要介紹了Python3 SSH遠(yuǎn)程連接服務(wù)器的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 分享10提高?Python?代碼的可讀性的技巧

    分享10提高?Python?代碼的可讀性的技巧

    這篇文章主要介紹了分享10提高?Python?代碼的可讀性的技巧,本文介紹20個常用的Python技巧來提高代碼的可讀性,并能幫助你節(jié)省大量時間,下面的技巧將在你的日常編碼練習(xí)中非常實(shí)用,需要的朋友可以參考一下
    2022-03-03
  • Python中__init__.py文件的作用

    Python中__init__.py文件的作用

    這篇文章主要介紹了Python中__init__.py文件的作用,在PyCharm中,帶有__init__.py這個文件的目錄被認(rèn)為是Python的包目錄,與普通目錄的圖標(biāo)有不一樣的顯示
    2022-09-09
  • 使用django的objects.filter()方法匹配多個關(guān)鍵字的方法

    使用django的objects.filter()方法匹配多個關(guān)鍵字的方法

    今天小編就為大家分享一篇使用django的objects.filter()方法匹配多個關(guān)鍵字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python實(shí)現(xiàn)小世界網(wǎng)絡(luò)生成

    python實(shí)現(xiàn)小世界網(wǎng)絡(luò)生成

    今天小編就為大家分享一篇python實(shí)現(xiàn)小世界網(wǎng)絡(luò)生成,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Keras實(shí)現(xiàn)支持masking的Flatten層代碼

    Keras實(shí)現(xiàn)支持masking的Flatten層代碼

    這篇文章主要介紹了Keras實(shí)現(xiàn)支持masking的Flatten層代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python 可視化神器Plotly詳解

    Python 可視化神器Plotly詳解

    這篇文章主要介紹了Python 可視化神器Plotly詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Python中的Socket 與 ScoketServer 通信及遇到問題解決方法

    Python中的Socket 與 ScoketServer 通信及遇到問題解決方法

    Socket有一個緩沖區(qū),緩沖區(qū)是一個流,先進(jìn)先出,發(fā)送和取出的可自定義大小的,如果取出的數(shù)據(jù)未取完緩沖區(qū),則可能存在數(shù)據(jù)怠慢。本文通過實(shí)例代碼給大家介紹Python中的Socket 與 ScoketServer 通信及遇到問題解決方法 ,需要的朋友參考下吧
    2019-04-04
  • python中文亂碼的解決方法

    python中文亂碼的解決方法

    亂碼在哪種語言里都會出現(xiàn),今天給你二個解決python中文亂碼的方法。
    2013-11-11
  • PyQT實(shí)現(xiàn)多窗口切換

    PyQT實(shí)現(xiàn)多窗口切換

    這篇文章主要為大家詳細(xì)介紹了PyQT實(shí)現(xiàn)多窗口切換的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評論

稻城县| 建阳市| 长春市| 吴旗县| 元朗区| 湖南省| 喀喇沁旗| 剑川县| 曲麻莱县| 呼伦贝尔市| 忻州市| 鄂尔多斯市| 天等县| 元阳县| 石狮市| 文登市| 松滋市| 堆龙德庆县| 平南县| 昌宁县| 丰都县| 石城县| 台北县| 九寨沟县| 聂荣县| 巢湖市| 离岛区| 乐至县| 二连浩特市| 桐乡市| 饶阳县| 鱼台县| 张掖市| 太仆寺旗| 三门县| 陇南市| 繁峙县| 辽中县| 江都市| 松潘县| 隆昌县|