第4章 NumPy基礎(chǔ):數(shù)組與向量化計(jì)算

  • ndarray:一種高效多維數(shù)組。

  • 一個(gè)例子比較NumPy數(shù)組和Python列表:


    image.png
  • NumPy核心特征之一就是N-維數(shù)組對(duì)象ndarray卢鹦,可以通過(guò)類似Python內(nèi)建對(duì)象的標(biāo)量計(jì)算語(yǔ)法進(jìn)行批量計(jì)算悄泥。如下:

    image.png

  • 一個(gè)ndarray是一個(gè)通用的多維同類數(shù)據(jù)容器虏冻,它里面的每一個(gè)元素都為相同類型,每個(gè)數(shù)組都有一個(gè)shape屬性弹囚,用來(lái)表征數(shù)組每一維的數(shù)量(data.shape)厨相,每個(gè)數(shù)組都有一個(gè)dtype屬性,用來(lái)描述數(shù)組的數(shù)據(jù)類型(data.dtype)鸥鹉。

  • 生成ndarray

    • array函數(shù)蛮穿,接受任意的序列型對(duì)象,例如:

      image.png

      嵌套序列毁渗,例如等長(zhǎng)的列表践磅,將會(huì)自動(dòng)轉(zhuǎn)換為多維數(shù)組。例如:


      image.png
    • zeros函數(shù)灸异,生成全0數(shù)組府适。

      image.png

    • empty函數(shù),生成未初始化值的數(shù)組肺樟。

    • arange函數(shù)檐春,等于Python中range的數(shù)組版。

    其他生成數(shù)組函數(shù)請(qǐng)見(jiàn)書(shū)P91.

  • ndarray數(shù)據(jù)類型

    • 創(chuàng)建數(shù)組的時(shí)候指定數(shù)據(jù)類型:
      arr1 = np.array([1,2,3]),dtype = np.float64)
      arr2 = np.array([1,2,3]),dtype = np.int32)

    • astype方法顯示地轉(zhuǎn)換數(shù)據(jù)類型:
      arr.astype(float64)
      可以傳入另一個(gè)數(shù)組的dtype屬性么伯,這樣將變成傳入數(shù)組的數(shù)據(jù)類型喇聊。
      arr.astype(arr1)

  • NumPy數(shù)組算數(shù)
    數(shù)組之所以重要是因?yàn)樗苓M(jìn)行批量操作而不需要for循環(huán),這種特性稱為向量化蹦狂。
    可以做+,-,*,/,>,<,**等運(yùn)算誓篱。
    注:同尺寸數(shù)組之間的比較朋贬,會(huì)產(chǎn)生一個(gè)布爾值數(shù)組。

  • 基礎(chǔ)索引與切片操作

    • 一維數(shù)組比較簡(jiǎn)單窜骄,與Python列表類似锦募。
      需要注意的是,區(qū)別于Python列表邻遏,數(shù)組的切片是原數(shù)組的試圖糠亩,就是把原數(shù)組的一部分展示出來(lái),而不是復(fù)制新建另一個(gè)新數(shù)組准验。例子如下:當(dāng)我改變切片后的數(shù)組后赎线,變化也會(huì)體現(xiàn)在原數(shù)組上。


      image.png
    • 如果你還是想要復(fù)制一份數(shù)組的切片的化糊饱,就需要顯式的復(fù)制這個(gè)數(shù)組垂寥,例如arr[5:8].copy()
  • 數(shù)組的切片索引
    arr[1:6]:第二個(gè)到第七個(gè)元素另锋。
    arr[:2,1:]:前兩行的第二列到最后一列的元素滞项。

  • 布爾索引
    考慮下列例子:


    image.png

    假設(shè)每個(gè)人名都和data數(shù)組中的一行相對(duì)應(yīng),并且我們要選中所有Bob對(duì)應(yīng)的行夭坪,與數(shù)學(xué)操作類似文判,數(shù)組的比較操作也是可以向量化的。將names數(shù)組與字符串Bob比較將會(huì)產(chǎn)生一個(gè)布爾值數(shù)組室梅。


    image.png

    在索引數(shù)組時(shí)可以將布爾值數(shù)組傳入:

image.png

使用布爾值索引數(shù)組時(shí)戏仓,總是生成數(shù)據(jù)的拷貝,即使返回的數(shù)組并沒(méi)有任何改變亡鼠。
利用基于常識(shí)設(shè)置布爾值也是可行的柜去,例如data[data < 0] = 0

  • 神奇索引
    神奇索引是NumPy中的術(shù)語(yǔ)拆宛,用于描述使用整數(shù)數(shù)組進(jìn)行索引嗓奢。

    假設(shè)我們有一個(gè)8*4的數(shù)組:


    image.png

    可以將位置序列傳入進(jìn)行索引:


    image.png

    神奇索引與切片不同,它總是將數(shù)據(jù)復(fù)制到一個(gè)新的數(shù)組中浑厚。
  • 數(shù)組轉(zhuǎn)置和換軸


    image.png

    當(dāng)你需要進(jìn)行矩陣計(jì)算時(shí)股耽,可能會(huì)用到轉(zhuǎn)置矩陣。例如钳幅,計(jì)算矩陣內(nèi)積:


    image.png

    另外兩個(gè)關(guān)于換軸操作的函數(shù):transpose,swapaxes物蝙。

  • 通用函數(shù):快速的逐元素?cái)?shù)組函數(shù)
    是一種在ndarray數(shù)據(jù)中進(jìn)行逐元素操作的函數(shù),例如sqrtexp函數(shù)敢艰。

    image.png

    上述函數(shù)稱為一元通用函數(shù)诬乞,只需要傳入一個(gè)數(shù)組,還有一些二元通用函數(shù),例如addmaximum震嫉。
    np.add(arr1,arr2)森瘪,將兩個(gè)數(shù)組相加。

    通用函數(shù)表見(jiàn)書(shū)P107票堵。

  • 將條件邏輯作為數(shù)組操作
    假設(shè)我們有兩個(gè)數(shù)值數(shù)組和一個(gè)布爾值數(shù)組:

    image.png

    現(xiàn)在我們進(jìn)行如下操作:假設(shè)cond中的元素為True時(shí)扼睬,我們?nèi)arr中對(duì)應(yīng)的元素,否則取yarr中對(duì)應(yīng)的元素悴势,通過(guò)列表推導(dǎo)式完成如下:
    result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
    image.png

    上述實(shí)現(xiàn)會(huì)產(chǎn)生很多問(wèn)題窗宇,如果數(shù)組很大的話,速度會(huì)很慢特纤,因?yàn)樗械墓ぷ鞫际峭ㄟ^(guò)解釋器解釋Python代碼完成军俊。其次,當(dāng)數(shù)組是多維時(shí)捧存,就無(wú)法湊效了粪躬,所以我們應(yīng)使用np.where方法。
    result = np.where(cond,xarr,yarr)

    • np.where方法第二個(gè)和第三個(gè)參數(shù)不一定非得是數(shù)組矗蕊,任何標(biāo)量都可以短蜕。

    • 一個(gè)常用場(chǎng)景氢架,根據(jù)一個(gè)數(shù)組來(lái)生成一個(gè)新的數(shù)組傻咖,假設(shè)你有一個(gè)隨機(jī)生成的矩陣數(shù)據(jù),并且你想將其中的正值都替換為2岖研,負(fù)值都替換為-2卿操,使用np.where實(shí)現(xiàn)如下:

      image.png

    • 又或是標(biāo)量和數(shù)組聯(lián)合:


      image.png
  • 數(shù)學(xué)和統(tǒng)計(jì)學(xué)方法

    • 用來(lái)求數(shù)組的最大值,最小值孙援,平均值等統(tǒng)計(jì)值害淤。
    • 一些統(tǒng)計(jì)方法函數(shù),見(jiàn)書(shū)P113拓售。
  • 布爾值數(shù)組的方法
    any:檢查數(shù)組中是否至少有一個(gè)True窥摄。
    all:檢查數(shù)組中是否全為False。

  • 唯一值與其他集合邏輯
    np.unique:NumPy包含一些針對(duì)一維數(shù)組的基礎(chǔ)操作础淤,常用的一個(gè)方法是np.unique崭放,返回的數(shù)組中唯一值排序后形成的數(shù)組。(類似集合)
    np.in1d:檢查一個(gè)數(shù)組的值是否在另一個(gè)數(shù)組中,并返回一個(gè)布爾值數(shù)組鸽凶。
    另一些其他方法見(jiàn)書(shū)P115币砂。

  • 使用數(shù)組進(jìn)行文件輸入和輸出

    • Numpy可以在硬盤中將數(shù)據(jù)以文本或二進(jìn)制文件的形式進(jìn)行存入硬盤或從硬盤中載入。
    • np.savenp.load是高效存取硬盤數(shù)據(jù)的兩大工具玻侥,后綴名是.npy决摧。
  • 線性代數(shù)
    常用的線性代數(shù)運(yùn)算見(jiàn)書(shū)P118。

  • 偽隨機(jī)數(shù)生成
    numpy.random模塊填補(bǔ)了Python內(nèi)建的random模塊的不足,可以高效的生成多種概率分布下的完整樣本值數(shù)組掌桩。例如你可以用normal來(lái)獲得一個(gè)4x4的正態(tài)分布樣本數(shù)組:

    image.png

    一些其他random函數(shù)見(jiàn)書(shū)P119边锁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拘鞋,隨后出現(xiàn)的幾起案子砚蓬,更是在濱河造成了極大的恐慌,老刑警劉巖盆色,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灰蛙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡隔躲,警方通過(guò)查閱死者的電腦和手機(jī)摩梧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宣旱,“玉大人仅父,你說(shuō)我怎么就攤上這事』胍鳎” “怎么了笙纤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)组力。 經(jīng)常有香客問(wèn)我省容,道長(zhǎng),這世上最難降的妖魔是什么燎字? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任腥椒,我火速辦了婚禮,結(jié)果婚禮上候衍,老公的妹妹穿的比我還像新娘笼蛛。我一直安慰自己,他們只是感情好蛉鹿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布滨砍。 她就那樣靜靜地躺著,像睡著了一般妖异。 火紅的嫁衣襯著肌膚如雪惋戏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天随闺,我揣著相機(jī)與錄音日川,去河邊找鬼。 笑死矩乐,一個(gè)胖子當(dāng)著我的面吹牛龄句,可吹牛的內(nèi)容都是我干的回论。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼分歇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼傀蓉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起职抡,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤葬燎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缚甩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谱净,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年擅威,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壕探。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郊丛,死狀恐怖李请,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厉熟,我是刑警寧澤导盅,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站揍瑟,受9級(jí)特大地震影響白翻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜月培,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一嘁字、第九天 我趴在偏房一處隱蔽的房頂上張望恩急。 院中可真熱鬧杉畜,春花似錦、人聲如沸衷恭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)随珠。三九已至灭袁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窗看,已是汗流浹背茸歧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留显沈,地道東北人软瞎。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓逢唤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涤浇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳖藕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354