亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python 的整數(shù)與 Numpy 的數(shù)據(jù)溢出

系統(tǒng) 1647 0
? Python貓 ” ,一個(gè)值得加星標(biāo)的 公眾號(hào)
某位 A 同學(xué)發(fā)了我一張截圖,問(wèn)為何結(jié)果中出現(xiàn)了負(fù)數(shù)?

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

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

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

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

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

在開(kāi)始之前,先總結(jié)一下上圖會(huì)引出的話題:
  • Python 3 中整數(shù)的上限是多少? Python 2 呢?

  • Numpy 中整數(shù)的上限是多少? 整數(shù)溢出該怎么辦?
對(duì)于第一個(gè)問(wèn)題,兩個(gè)版本的 Python 有所區(qū)別。先看看 Python 2,它有兩種整數(shù):
  • 一種是短整數(shù),也即常說(shuō)的整數(shù),用 int 表示,有個(gè)內(nèi)置函數(shù) int()。其大小有限,可通過(guò) sys.maxint() 查看(取決于平臺(tái)是 32 位還是 64 位)
  • 一種是長(zhǎng)整數(shù),即大小無(wú)限的整數(shù),用 long 表示,有個(gè)內(nèi)置函數(shù) long()。寫法上是在數(shù)字后面加大寫字母 L 或小寫的 l,如 1000L

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

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

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

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

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

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

Python 在語(yǔ)言運(yùn)用層屏蔽了很多瑣碎的活,比如內(nèi)存分配,所以,我們?cè)谑褂米址⒘斜砘蜃值涞葘?duì)象時(shí),根本不用操心。整數(shù)類型的轉(zhuǎn)變,也是出于這樣的便利目的。(壞處是犧牲了一些效率,在此就不談了)

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

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

有一種方式可查看:

                
                  import?numpy?as?np

a?=?np.arange(2)
type(a[0])

#?結(jié)果:numpy.int32

                
              

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

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

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

Python 的整數(shù)與 Numpy 的數(shù)據(jù)溢出_第3張圖片
截圖來(lái)源: https://www.runoob.com/numpy/numpy-dtype.html

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

                
                  import?numpy?as?np

q?=?[100000]
w?=?[500000]

#?一個(gè)溢出的例子:
a?=?np.array(q)
b?=?np.array(w)
print(a*b)??#?產(chǎn)生溢出,結(jié)果是個(gè)奇怪的數(shù)值

#?一個(gè)解決的例子:
c?=?np.array(q,?dtype='int64')
d?=?np.array(w,?dtype='int64')
print(c*d)?#?沒(méi)有溢出:[50000000000]

                
              

好了,前面提出的問(wèn)題就回答完了。

來(lái)作個(gè)結(jié)尾吧:
  • Python 3 極大地簡(jiǎn)化了整數(shù)的表示,效果可表述為:整數(shù)就只有一種整數(shù)(int),沒(méi)有其它類型的整數(shù)(long、int8、int64 之類的)
  • Numpy 中的整數(shù)類型對(duì)應(yīng)于 C 語(yǔ)言的數(shù)據(jù)類型,每種“整數(shù)”有自己的區(qū)間,要解決數(shù)據(jù)溢出問(wèn)題,需要指定更大的數(shù)據(jù)類型(dtype)

640?

作者簡(jiǎn)介: 豌豆花下貓,生于廣東畢業(yè)于武大,現(xiàn)為蘇漂程序員,有一些極客思維,也有一些人文情懷,有一些溫度,還有一些態(tài)度。

往期文章,推薦閱讀:

為什么要翻譯?值得堅(jiān)持下去么?

Python 之父的解析器系列之四:可視化 PEG 解析

用 Python 實(shí)現(xiàn)簡(jiǎn)易 Web 服務(wù)器

遇見(jiàn)一只黑貓,她說(shuō)程序員都是騙子

Python 的整數(shù)與 Numpy 的數(shù)據(jù)溢出_第4張圖片

告訴朋友們,我在看 640?wx_fmt=png

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 成人午夜视频在线播放 | 国产欧美日韩在线播放 | 国产精品久久久久久一区二区三区 | 欧洲免费在线视频 | 香蕉福利久久福利久久香蕉 | 中文字幕三级理论影院 | 亚洲一区二区三区成人 | 九九在线偷拍视频在线播放 | 久久免费小视频 | 在线观看精品视频一区二区三区 | 黄页网址在线免费观看 | 一区二区三区免费视频 www | 狠狠色欧美亚洲综合色黑a 狠狠色视频 | 丁香午夜 | 亚洲精品久久久久中文字小说 | 91精品成人免费国产片 | 奇米色7777| 亚洲精品视频一区二区 | 国产在线精品一区二区中文 | 九九久久精品这里久久网 | 国产成人在线小视频 | 911福利视频| 国产一区二区精品久久小说 | 久夜色精品国产一区二区三区 | www.亚洲在线| 精品一区二区三区在线观看视频 | 久久久福利 | 国产成人精品曰本亚洲77美色 | 手机看片日韩国产一区二区 | 亚洲国产成人99精品激情在线 | 网红被免费网站视频在线 | 国内精品一级毛片免费看 | 国产精品久久久久免费 | www神马我不卡影院免费观看 | 丝袜三级| 在线综合网 | 久久这里只有精品2 | 国产精品久久久久久久久久直 | 精品一区二区三区的国产在线观看 | 亚州在线播放 | 全亚洲最大的免费私人影剧院 |