手把手教你用Python的NumPy包處理數(shù)據(jù)

導(dǎo)讀:本文讓你快速了解一下如何開始使用NumPy媚赖。一旦你熟悉了NumPy矫限,就會發(fā)現(xiàn)Python世界中的大多數(shù)科學(xué)計算都是圍繞NumPy構(gòu)建的催式。因此花在NumPy上的學(xué)習(xí)時間最終對你是有益的徽曲。
(教程領(lǐng)到手临庇,學(xué)習(xí)不用愁反璃!vx:Y20200324324 備注JS即可免費(fèi)領(lǐng)取哦!)

image

如果你已經(jīng)安裝了Anaconda假夺,那么就假設(shè)你已經(jīng)在虛擬環(huán)境中安裝了NumPy淮蜈。如果你使用過Python的標(biāo)準(zhǔn)發(fā)行版或任何其他發(fā)行版,你可以訪問

http://www.numpy.org

并按照所提供的安裝說明進(jìn)行操作已卷。

01 導(dǎo)入NumPy

一旦啟動了一個新的IPython或者Jupyter會話梧田,就可以導(dǎo)入Numpy模塊并按照以下步驟來驗(yàn)證版本:

import numpy
numpy.__version__

輸出結(jié)果:

1.15.4

提示:記得在Jupyter Notebook中,鍵入命令后侧蘸,你可以按下Ctrl+Enter裁眯,以執(zhí)行一個單元格』浒或者穿稳,按下Shift+Enter以執(zhí)行單元格,并自動插入或者選擇該單元格下面的單元格晌坤。依次單擊Help | Keyboard Shortcut以檢查所有的鍵盤快捷鍵逢艘,或者依次單擊Help | User Interface Tour以進(jìn)行快速瀏覽旦袋。

此處討論的部分包,建議使用NumPy 1.8版本或后續(xù)版本埋虹。按照慣例猜憎,你會發(fā)現(xiàn)在科學(xué)Python領(lǐng)域中,大多數(shù)人導(dǎo)入NumPy都會使用np作為別名:

import numpy as np
np.__version__

輸出結(jié)果:

1.15.4

02 理解NumPy數(shù)組

Python是一種弱類型的語言搔课。這就意味著胰柑,你無論何時創(chuàng)建一個新變量,都不必指定數(shù)據(jù)類型爬泥。例如柬讨,下面的內(nèi)容將自動表示為一個整數(shù):

a=5

輸入下面內(nèi)容以再次確認(rèn):

type(a)

輸出結(jié)果:

int

注意:因?yàn)闃?biāo)準(zhǔn)Python實(shí)現(xiàn)是用C編寫的,所以每個Python對象本質(zhì)上是一個偽C結(jié)構(gòu)袍啡。這對于Python中的整數(shù)也是如此踩官,實(shí)際上它是指向復(fù)合C結(jié)構(gòu)的指針,包含的不僅僅是原始整數(shù)值境输。因此蔗牡,用于表示Python整數(shù)的默認(rèn)C數(shù)據(jù)類型將依賴于你的系統(tǒng)架構(gòu)(即系統(tǒng)是32位還是64位平臺)。

更進(jìn)一步嗅剖,我們使用list()命令可以創(chuàng)建一個整數(shù)列表辩越,這是Python中的標(biāo)準(zhǔn)多元素容器。range (x)函數(shù)將創(chuàng)建從0到x–1的所有整數(shù)信粮。要輸出變量黔攒,你可以使用print函數(shù),也可以直接輸入變量名字并按Enter:

int_list =list(range(10))
int_list

輸出結(jié)果:

[0,1,2,3,4,5,6,7,8,9]

類似地强缘,我們通過讓Python遍歷整數(shù)列表int_list中的所有元素督惰,并對每個元素應(yīng)用str()函數(shù)(該函數(shù)將一個數(shù)轉(zhuǎn)換成一個字符串),來創(chuàng)建一個字符串列表:

str_list= [str(i) for i in int_list]
str_list

輸出結(jié)果:

['0','1','2','3','4','5','6','7','8','9']

可是旅掂,用列表進(jìn)行數(shù)學(xué)運(yùn)算并不是很靈活赏胚。例如,我們想要將int_list中的每個元素都乘以一個因子2商虐。執(zhí)行以下操作可能是一種簡單的方法—看看輸出結(jié)果是怎樣的:

int_list*2

輸出結(jié)果:

[0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]

Python創(chuàng)建了一個列表栅哀,其內(nèi)容是int_list的所有元素生成了兩次,這并不是我們想要的称龙!

這就是NumPy的用武之地。NumPy是專為簡化Python中的數(shù)組運(yùn)算而設(shè)計的戳晌。我們可以快速將整數(shù)列表轉(zhuǎn)換為一個NumPy數(shù)組:

import numpy as np 
int_arr = np.array(int_list)
int_arr

輸出結(jié)果:

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

讓我們看看試著將數(shù)組中的每個元素相乘會怎么樣:

int_arr*2

輸出結(jié)果:

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

這次我們做對了鲫尊!加法、減法沦偎、除法以及很多其他運(yùn)算也是同樣的疫向。

而且咳蔚,每個NumPy數(shù)組都具有以下屬性:

ndim:維數(shù)。

shape:每一維的大小搔驼。

size:數(shù)組中元素的總數(shù)谈火。

dtype:數(shù)組的數(shù)據(jù)類型(例如int、float舌涨、string等)糯耍。

讓我們來看看整數(shù)數(shù)組的上述屬性:

print("int_arr ndim: ", int_arr.ndim)
print("int_arr shape: ", int_arr.shape)
print("int_arr size: ", int_arr.size)
print("int_arr dtype: ", int_arr.dtype)

輸出結(jié)果:

int_arrndim:1
int_arrshape:(10,)
int_arrsize:10
int_arrdtype:int64

從這些輸出中,我們可以看到我們的數(shù)組只包含一維囊嘉,其包含10個元素且所有元素都是64位的整數(shù)温技。當(dāng)然,如果你在32位機(jī)器上執(zhí)行這段代碼扭粱,你可能會得到dtype:int 32舵鳞。

03 通過索引訪問單個數(shù)組元素

如果你之前使用過Python的標(biāo)準(zhǔn)列表索引,那么你就不會發(fā)現(xiàn)NumPy中的索引有很多問題琢蛤。在一維數(shù)組中蜓堕,通過在方括號中指定所需的索引,可以訪問第i個值(從0開始計算)博其,與Python列表一樣:

int_arr

輸出結(jié)果:

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

int_arr[0]

輸出結(jié)果:

0
int_arr[3]

輸出結(jié)果:

3

要從數(shù)組的末尾建立索引套才,可以使用負(fù)索引號:

int_arr[-1]

輸出結(jié)果:

9
int_arr[-2]

輸出結(jié)果:

8

切割數(shù)組還有一些其他很酷的技巧,如下所示:

int_arr[2:5]#fromindex2uptoindex5-1

輸出結(jié)果:

array([2,3,4])
int_arr[:5]#from the beginning up to index 5 - 1

輸出結(jié)果:

array([0,1,2,3,4])
int_arr[5:]#from index 5 up to the end of the array

輸出結(jié)果:

array([5,6,7,8,9])
int_arr[::2]#every other element

輸出結(jié)果:

array([0,2,4,6,8])
int_arr[::-1]#the entire array in reverse order

輸出結(jié)果:

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

建議你自己嘗試使用這些數(shù)組贺奠!

提示:NumPy中切割數(shù)組的一般形式與標(biāo)準(zhǔn)Python列表中的相同霜旧。使用x [start: stop: step]訪問數(shù)組x中的一個片段。如果沒有指定任何一個值儡率,那么默認(rèn)值為start=0挂据、stop=size of dimension、step=1儿普。

04 創(chuàng)建多維數(shù)組

數(shù)組不必局限于列表崎逃。實(shí)際上,數(shù)組可以有任意維數(shù)眉孩。在機(jī)器學(xué)習(xí)中个绍,通常我們至少要處理二維數(shù)組,列索引表示特定的特征值浪汪,行包含實(shí)際的特征值巴柿。

使用NumPy可以輕松地從頭開始創(chuàng)建多維數(shù)組。假設(shè)我們想要創(chuàng)建一個3行5列的數(shù)組死遭,所有的元素都初始化為0广恢。如果我們不指定數(shù)據(jù)類型,NumPy將默認(rèn)使用float類型:

arr_2d = np.zeros((3, 5))

arr_2d

輸出結(jié)果:

array([[0.,0.,0.,0.,0.],
       [0.,0.,0.,0.,0.],
       [0.,0.,0.,0.,0.]])

使用OpenCV時你可能就知道:這可以解釋為所有像素設(shè)置為0(黑色)的一個3×5的灰度圖像呀潭。例如钉迷,如果你想要創(chuàng)建具有3個顏色通道(R至非、G和B)2×4像素的一個小圖像,但是所有像素都設(shè)置為白色糠聪,我們將使用NumPy創(chuàng)建一個3×2×4的三維數(shù)組:

arr_float_3d=np.ones((3,2,4))
arr_float_3d

輸出結(jié)果:

array([[[1.,1.,1.,1.],[1.,1.,1.,1.]],
      [[1.,1.,1.,1.],[1.,1.,1.,1.]],
      [[1.,1.,1.,1.],[1.,1.,1.,1.]]])

這里荒椭,第一維定義顏色通道(OpenCV中的藍(lán)色、綠色和紅色)舰蟆。因此趣惠,如果這是真實(shí)的圖像數(shù)據(jù),我們可以通過切割數(shù)組輕松地獲得第一個通道中的顏色信息:

arr_float_3d[0, :, :]

輸出結(jié)果:

array([[1.,1.,1.,1.],
      [1.,1.,1.,1.]])

在OpenCV中夭苗,圖像要么是值在0到1之間的32位浮點(diǎn)數(shù)組信卡,要么是值在0到255之間的8位整數(shù)數(shù)組。因此题造,使用8位整數(shù)傍菇,通過指定NumPy的dtype屬性并將數(shù)組中的所有1乘以255,我們還可以創(chuàng)建一個2×4像素界赔、全為白色的RGB圖像:

arr_uint_3d=np.ones((3,2,4),dtype=np.uint8)*255arr_uint_3d

輸出結(jié)果:

array([[[255,255,255,255],
        [255,255,255,255]],

       [[255,255,255,255],
        [255,255,255,255]],

      [[255,255,255,255],
        [255,255,255,255]]],dtype=uint8)

關(guān)于作者:阿迪蒂亞·夏爾馬(Aditya Sharma)丢习,羅伯特·博世(Robert Bosch)公司的一名高級工程師,致力于解決真實(shí)世界的自動計算機(jī)視覺問題淮悼。曾獲得羅伯特·博世公司2019年人工智能編程馬拉松的首名咐低。
維什韋什·拉維·什里馬利(Vishwesh Ravi Shrimali),于2018年畢業(yè)于彼拉尼博拉理工學(xué)院(BITS Pilani)機(jī)械工程專業(yè)袜腥。此后一直在BigVision LLC從事深度學(xué)習(xí)和計算機(jī)視覺方面的工作见擦,還參與了官方OpenCV課程的創(chuàng)建。
邁克爾·貝耶勒(Michael Beyeler)羹令,是華盛頓大學(xué)神經(jīng)工程和數(shù)據(jù)科學(xué)的博士后研究員鲤屡,致力于仿生視覺的計算模型研究,以為盲人植入人工視網(wǎng)膜(仿生眼睛)福侈,改善盲人的感知體驗(yàn)酒来。他的工作屬于神經(jīng)科學(xué)、計算機(jī)工程肪凛、計算機(jī)視覺和機(jī)器學(xué)習(xí)的交叉領(lǐng)域堰汉。

本文摘編自《機(jī)器學(xué)習(xí):使用OpenCV、Python和scikit-learn進(jìn)行智能圖像處理(原書第2版)》伟墙,經(jīng)出版方授權(quán)發(fā)布翘鸭。

image

延伸閱讀《機(jī)器學(xué)習(xí)》(原書第2版)

一本基于OpenCV4和Python的機(jī)器學(xué)習(xí)實(shí)戰(zhàn)手冊,既詳細(xì)介紹機(jī)器學(xué)習(xí)及OpenCV相關(guān)的基礎(chǔ)知識戳葵,又通過具體實(shí)例展示如何使用OpenCV和Python實(shí)現(xiàn)各種機(jī)器學(xué)習(xí)算法就乓,并提供大量示例代碼,可以幫助你掌握機(jī)器學(xué)習(xí)實(shí)用技巧,解決各種不同的機(jī)器學(xué)習(xí)和圖像處理問題档址。
教程領(lǐng)到手,學(xué)習(xí)不用愁邻梆!vx:Y20200324324 備注JS即可免費(fèi)領(lǐng)取哦守伸!

作者:阿迪蒂亞·夏爾馬(Aditya Sharma)、維什韋什·拉維·什里馬利(Vishwesh Ravi Shrimali)浦妄、邁克爾·貝耶勒(Michael Beyeler)

來源:華章科技

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尼摹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剂娄,更是在濱河造成了極大的恐慌蠢涝,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅懦,死亡現(xiàn)場離奇詭異和二,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耳胎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門惯吕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怕午,你說我怎么就攤上這事废登。” “怎么了郁惜?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵堡距,是天一觀的道長。 經(jīng)常有香客問我兆蕉,道長羽戒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任恨樟,我火速辦了婚禮半醉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劝术。我一直安慰自己缩多,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布养晋。 她就那樣靜靜地躺著衬吆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绳泉。 梳的紋絲不亂的頭發(fā)上逊抡,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼冒嫡。 笑死拇勃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孝凌。 我是一名探鬼主播方咆,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟀架!你這毒婦竟也來了瓣赂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤片拍,失蹤者是張志新(化名)和其女友劉穎煌集,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌省,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苫纤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了所禀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片方面。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖色徘,靈堂內(nèi)的尸體忽然破棺而出恭金,到底是詐尸還是另有隱情,我是刑警寧澤褂策,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布横腿,位于F島的核電站,受9級特大地震影響斤寂,放射性物質(zhì)發(fā)生泄漏耿焊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一遍搞、第九天 我趴在偏房一處隱蔽的房頂上張望罗侯。 院中可真熱鬧,春花似錦溪猿、人聲如沸钩杰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讲弄。三九已至,卻和暖如春依痊,著一層夾襖步出監(jiān)牢的瞬間避除,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶摆,地道東北人凉逛。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像群井,于是被迫代替她去往敵國和親鱼炒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350