欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

看了圖,我第一感覺就是數(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ù)卻沒有溢出?

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

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

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

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

關(guān)于第一個(gè)問(wèn)題,先看看 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ù)沒有上限(只要不超出內(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í)沒有溢出:100007*4549、100012*13264,其它數(shù)據(jù)組都溢出了,所以出現(xiàn)奇怪的負(fù)數(shù)結(jié)果。

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

截圖來(lái)源:https://www.runoob.com/numpy/numpy-dtype.html

要解決整數(shù)溢出問(wèn)題,可以通過(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) # 沒有溢出:[50000000000]

好了,前面提出的問(wèn)題就回答完了。來(lái)作個(gè)結(jié)尾吧:

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

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

相關(guān)文章

  • Python實(shí)現(xiàn)人臉識(shí)別

    Python實(shí)現(xiàn)人臉識(shí)別

    這篇文章主要介紹了Python實(shí)現(xiàn)人臉識(shí)別,首選抓取多張圖片,從中獲取特征數(shù)據(jù)集和平均特征值然后寫入?csv?文件?-?計(jì)算特征數(shù)據(jù)集的歐式距離作對(duì)比,下面一起來(lái)看具體得實(shí)現(xiàn)過(guò)程吧
    2022-01-01
  • 使用Python繪制空氣質(zhì)量日歷圖

    使用Python繪制空氣質(zhì)量日歷圖

    這篇文章主要介紹了使用Python繪制空氣質(zhì)量日歷圖,文章基于Python繪制的相關(guān)知識(shí)展開對(duì)空氣質(zhì)量日歷圖的繪制,感興趣的小伙伴可以參考一下
    2022-05-05
  • python3使用python-redis-lock解決并發(fā)計(jì)算問(wèn)題

    python3使用python-redis-lock解決并發(fā)計(jì)算問(wèn)題

    本文主要介紹了python3使用python-redis-lock解決并發(fā)計(jì)算問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • python-leetcode求區(qū)間[M,N]內(nèi)的所有素?cái)?shù)的個(gè)數(shù)實(shí)現(xiàn)方式

    python-leetcode求區(qū)間[M,N]內(nèi)的所有素?cái)?shù)的個(gè)數(shù)實(shí)現(xiàn)方式

    這篇文章主要介紹了python-leetcode求區(qū)間[M,N]內(nèi)的所有素?cái)?shù)的個(gè)數(shù)實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • pycharm如何debug for循環(huán)里面的錯(cuò)誤值(推薦)

    pycharm如何debug for循環(huán)里面的錯(cuò)誤值(推薦)

    一般debug時(shí),在for循環(huán)里面的話,需要自己一步一步點(diǎn),如果循環(huán)幾百次那種就比較麻煩,此時(shí)可以采用try except的方式來(lái)解決,這篇文章主要介紹了pycharm如何debug for循環(huán)里面的錯(cuò)誤值,需要的朋友可以參考下
    2024-07-07
  • flask操作數(shù)據(jù)庫(kù)相關(guān)配置及實(shí)現(xiàn)示例步驟全解

    flask操作數(shù)據(jù)庫(kù)相關(guān)配置及實(shí)現(xiàn)示例步驟全解

    這篇文章主要介紹了flask操作數(shù)據(jù)庫(kù)相關(guān)配置及實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 解決Python3中的中文字符編碼的問(wèn)題

    解決Python3中的中文字符編碼的問(wèn)題

    Unicode是一32位編碼格式,不適合用來(lái)傳輸和存儲(chǔ),所以必須轉(zhuǎn)換成utf-8,gbk等等。這篇文章主要介紹了Python3中的解決中文字符編碼的問(wèn)題,需要的朋友可以參考下
    2018-07-07
  • Python實(shí)現(xiàn)密鑰密碼(加解密)實(shí)例詳解

    Python實(shí)現(xiàn)密鑰密碼(加解密)實(shí)例詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)密鑰密碼(加解密),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python自動(dòng)化實(shí)現(xiàn)的簡(jiǎn)單使用

    python自動(dòng)化實(shí)現(xiàn)的簡(jiǎn)單使用

    本文主要介紹了python自動(dòng)化實(shí)現(xiàn)的簡(jiǎn)單使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • pandas?實(shí)現(xiàn)?in?和?not?in?的用法及使用心得

    pandas?實(shí)現(xiàn)?in?和?not?in?的用法及使用心得

    pandas按條件篩選數(shù)據(jù)時(shí),除了使用query()方法,還可以使用isin和對(duì)isin取反進(jìn)行條件篩選,今天通過(guò)本文給大家介紹pandas?實(shí)現(xiàn)?in?和?not?in?的用法及使用心得,感興趣的朋友跟隨小編一起看看吧
    2023-01-01

最新評(píng)論