Python易筋經-numpy

“五色令人目盲燥翅,五音令人耳聾蜕提,五味令人口爽,馳騁畋獵令人心發(fā)狂凛膏,難得之貨令人行妨脏榆。
是以圣人為腹不為目,故去彼取此吁断∥肷”[1]

numpy

NumPy數組通常是由相同種類的元素組成的,既數組中的數據項的類型必須一致又兵。
通常先要引入numpy包:

import numpy as np

創(chuàng)建一個簡單的一維數據:

arr1 = np.arange(5)
arr1

輸出:

dtype('int64')

以上數組的數據類型為int64,除了知道數據類型之外宙地,還要注意其形狀逆皮,這一點非常重要。

arr1

輸出:

array([0, 1, 2, 3, 4])
arr1.shape

輸出:

(5,)

如你所見粹胯,該向量有5個元素辰企,他們的值分別是從0到4,該數組的shape屬性是一個元組,存放的是數組在每一個維度的長度竹观。

創(chuàng)建多維數據

數組大于一維以后潜索,我們習慣稱之為矩陣,下面創(chuàng)建一個2行2列的矩陣:

metr = np.array([1,2],[3,4])

上面的矩陣是通過向array()函數傳遞一個由列表組成的列表得到的誊抛,接下來整陌,我們要逐個選擇矩陣的各個元素,代碼如下所示随夸。下標從0開始震放,如下取出第1行第1列、第2行第2列的元素:

metr[0][0] 
metr[1][1]

輸出:

1
4

可見诈铛,選擇數組元素是一件非常簡單的事情墨礁,對于數組metr,只要通過metr[m,n]的形態(tài)妨退,就能訪問數組內的元素,其中m和n為數組元素的下標冠句。

一維數組的切片與索引

一維NumPy數組的切片操作與Python列表的切片一樣幸乒。下面先來定義包括0、1聚唐、2腔召,直到8的一個數組,然后通過指定下標2到5來選擇該數組的部分元素亲桦,這實際上就是提取數組中值為2到5的那些元素浊仆。

arr2 = np.arange(9)
arr2[2:6] 

輸出:

array([2, 3, 4, 5]) 

可以用下標選擇元素,下標范圍從0到7抡柿,并且下標每次遞增2,如:

arr2[:7:2]

輸出:

array([0, 2, 4, 6])

恰如使用Python那樣备蚓,也可用負值下標來反轉數組:

arr2[::-1]

輸出:

array([8, 7, 6, 5, 4, 3, 2, 1, 0])

處理數組形態(tài)

常用的處理數組形態(tài)的方法闪檬,先記錄如下幾個:

  • reshape()
  • ravel()
  • flatten()
  • transpose()
  • resize()
reshape()

將一個由0到11構成的一維數組购笆,改變?yōu)?行4列的二維數組:

arr3 = np.arange(12).reshape(3,4)
arr3

輸出:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
ravel()

將多維數組變成一維數組
將上面的二維數據再改變?yōu)橐痪S數組:

arr3.ravel()

輸出:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
flatten()

其功能與ravel()相同同欠。可是衫哥,flatten()返回的是真實的數組襟锐,需要分配新的內存空間;而ravel()函數返回的只是數組的視圖蚊荣。兩者的區(qū)別在于返回拷貝(copy)還是返回視圖(view),numpy.flatten()返回一份拷貝奢入,對拷貝所做的修改不會影響(reflects)原始矩陣媳叨,而numpy.ravel()返回的是視圖(view,也頗有幾分C/C++引用reference的意味)武福,會影響(reflects)原始矩陣痘番。

arr3.flatten()

輸出:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
transpose()

轉置:在線性代數中,矩陣的轉置操作非常常見界睁。轉置是一種數據變換方法兵拢,對于二維表而言,轉置就意味著行變成列访惜,同時列變成行腻扇。
如:創(chuàng)建一個0-11數字組成的一維數組,先reshape為3行4列的數組:

arr4 = np.arange(12).reshape(3,4)
arr4

輸出:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

然后對其進行轉置:

arr4.transpose()

輸出:

array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
resize()

調整大兄侠椤:函數resize()的作用類似于reshape()舶沿,但是會改變所作用的數組:
如:將arr4調整為2行6列的二維數組

arr4.resize(2,6)
arr4

輸出:

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

堆疊數組

從深度看括荡,數組既可以橫向疊放,也可以豎向疊放畸冲。涉及許下幾個方法:

  • vstack()
  • dstack()
  • hstack()
  • column_stack()
  • row_stack()
  • concatenate()

先創(chuàng)建兩個數組a 和 b,均為3行3列的二維數據:
數組a

a = np.arange(9).reshape(3,3)
a

輸出a:

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

數組b

b = a*2
b

輸出b:

array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
hstack()

水平疊加:先介紹水平疊加方式恕沫,即用元組確定ndarrays數組的形狀纱意,然后交由hstack()函數來碼放這些數組。

np.hstack((a,b))

輸出:

array([[ 0,  1,  2,  0,  2,  4],
       [ 3,  4,  5,  6,  8, 10],
       [ 6,  7,  8, 12, 14, 16]])

將調用hstack時a和b的入參順序換一下再看看結果:

np.hstack((b,a))

輸出:

array([[ 0,  2,  4,  0,  1,  2],
       [ 6,  8, 10,  3,  4,  5],
       [12, 14, 16,  6,  7,  8]])
vstack()

垂直疊加:使用垂直疊加方法時迄委,先要構建一個元祖类少,然后將元祖交給vstack()函數來碼放數組。

np.vstack((a,b))

輸出:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

當參數axis置0時信轿,concatenate()函數也會得到相同的效果残吩。實際上,這是該參數的缺省值:

np.concatenate((a,b),axis=0)

輸出:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
dstack()

深度疊加:除此之外即彪,還有一種深度疊加方法活尊,這要用到dstack()函數和一個元組蛹锰。這種方法是沿著第三個坐標軸(縱向)的方向來疊加一摞數組。舉例來說铜犬,可以在一個圖像數據的二維數組上疊加另一幅圖像的數據翎苫。

np.dstack((a,b))

輸出:

array([[[ 0,  0],
        [ 1,  2],
        [ 2,  4]],

       [[ 3,  6],
        [ 4,  8],
        [ 5, 10]],

       [[ 6, 12],
        [ 7, 14],
        [ 8, 16]]])

拆分numpy數組

可以從縱向榨了,橫向和深度方向來拆分數組,相關函數有hsplit(),vsplit(),dsplit()和split()呐粘。我們即可以把數組分成相同的形狀的數組,也可以從規(guī)定的位置開始切取數組唆垃。
橫向拆分:對于一個3行3列數組痘儡,可以沿著橫軸方向將其分解為3部分,并且各部分的大小和形狀完全一致渐尿。

np.hsplit(a,3)

輸出:

[array([[0],
        [3],
        [6]]), array([[1],
        [4],
        [7]]), array([[2],
        [5],
        [8]])]

這個相當于調用了參數axis = 1的split()函數:

np.split(a,3,1)

輸出:

[array([[0],
        [3],
        [6]]), array([[1],
        [4],
        [7]]), array([[2],
        [5],
        [8]])]

縱向拆分:同理

np.vsplit(a,3)

輸出:

[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

深向拆分:dsplit()函數會沿著深度方向分解數組矾瑰。

后記:關于本文數據的由來

玩python殴穴,最好在本地安裝Anaconda,里面有notebook的運行環(huán)境采幌,交互式的筆記notebook是最好的工具休傍,沒有之一。

  • 下載安裝anaconda炒瘸,運行寝衫,如下圖為主界面


    anaconda.png
  • 點擊"jupyter notebook",可以啟動notebook運行環(huán)境隘截,新建一個notebook python的文檔汹胃,形如界面:


    notebook.png
  • 目前網上支持notebook最好的免費平臺就是github了着饥,將自己的notebook文檔上傳到github上可以進行分享。


  1. 老子《道德經》第十二章呵哨,老子故里,中國鹿邑孟害。 ?

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末挨务,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子果漾,更是在濱河造成了極大的恐慌谷誓,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户辱,死亡現場離奇詭異庐镐,居然都是意外死亡变逃,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門名眉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰棉,“玉大人,你說我怎么就攤上這事福压』蛭瑁” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魏宽。 經常有香客問我决乎,道長派桩,這世上最難降的妖魔是什么铆惑? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任送膳,我火速辦了婚禮叠聋,結果婚禮上,老公的妹妹穿的比我還像新娘碌补。我一直安慰自己,他們只是感情好镇匀,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布汗侵。 她就那樣靜靜地躺著群发,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宫屠。 梳的紋絲不亂的頭發(fā)上滑蚯,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音坤次,去河邊找鬼斥赋。 笑死,一個胖子當著我的面吹牛滑绒,可吹牛的內容都是我干的。 我是一名探鬼主播疑故,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼纵势,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了软舌?” 一聲冷哼從身側響起牛曹,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤黎比,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糟描,有當地人在樹林里發(fā)現了一具尸體书妻,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡躲履,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了米诉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷帅。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡魏身,死狀恐怖,靈堂內的尸體忽然破棺而出箭昵,到底是詐尸還是另有隱情,我是刑警寧澤正林,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布觅廓,位于F島的核電站,受9級特大地震影響粥烁,放射性物質發(fā)生泄漏蝇棉。R本人自食惡果不足惜芥永,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一埋涧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棘催,春花似錦、人聲如沸邑跪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淫僻,卻和暖如春壶唤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背视粮。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岛啸,地道東北人茴肥。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓瓤狐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親础锐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容

  • 來源:NumPy Tutorial - TutorialsPoint 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...
    布客飛龍閱讀 32,840評論 6 97
  • 基礎篇NumPy的主要對象是同種元素的多維數組。這是一個所有的元素都是一種類型鸵隧、通過一個正整數元組索引的元素表格(...
    oyan99閱讀 5,133評論 0 18
  • 先決條件 在閱讀這個教程之前豆瘫,你多少需要知道點python菊值。如果你想從新回憶下,請看看Python Tutoria...
    舒map閱讀 2,584評論 1 13
  • 原文:Quickstart tutorial 譯者:Reverland 來源:試驗性NumPy教程(譯) 2.1 ...
    布客飛龍閱讀 1,356評論 5 52
  • NumPy是Python中關于科學計算的一個類庫略步,在這里簡單介紹一下趟薄。 來源:https://docs.scipy...
    灰太狼_black閱讀 1,229評論 0 5