手把手教你用Python的NumPy包处理数据
導(dǎo)讀:本文讓你快速了解一下如何開(kāi)始使用NumPy。一旦你熟悉了NumPy,就會(huì)發(fā)現(xiàn)Python世界中的大多數(shù)科學(xué)計(jì)算都是圍繞NumPy構(gòu)建的。因此花在NumPy上的學(xué)習(xí)時(shí)間最終對(duì)你是有益的。
作者:阿迪蒂亞·夏爾馬(Aditya Sharma)、維什韋什·拉維·什里馬利(Vishwesh Ravi Shrimali)、邁克爾·貝耶勒(Michael Beyeler)
來(lái)源:大數(shù)據(jù)DT(ID:hzdashuju)
如果你已經(jīng)安裝了Anaconda,那么就假設(shè)你已經(jīng)在虛擬環(huán)境中安裝了NumPy。如果你使用過(guò)Python的標(biāo)準(zhǔn)發(fā)行版或任何其他發(fā)行版,你可以訪問(wèn)
http://www.numpy.org
并按照所提供的安裝說(shuō)明進(jìn)行操作。
01?導(dǎo)入NumPy
一旦啟動(dòng)了一個(gè)新的IPython或者Jupyter會(huì)話,就可以導(dǎo)入Numpy模塊并按照以下步驟來(lái)驗(yàn)證版本:
import?numpy numpy.__version__輸出結(jié)果:
1.15.4提示:記得在Jupyter Notebook中,鍵入命令后,你可以按下Ctrl+Enter,以執(zhí)行一個(gè)單元格。或者,按下Shift+Enter以執(zhí)行單元格,并自動(dòng)插入或者選擇該單元格下面的單元格。依次單擊Help | Keyboard Shortcut以檢查所有的鍵盤快捷鍵,或者依次單擊Help | User Interface Tour以進(jìn)行快速瀏覽。
此處討論的部分包,建議使用NumPy 1.8版本或后續(xù)版本。按照慣例,你會(huì)發(fā)現(xiàn)在科學(xué)Python領(lǐng)域中,大多數(shù)人導(dǎo)入NumPy都會(huì)使用np作為別名:
import?numpy?as?np np.__version__輸出結(jié)果:
1.15.402 理解NumPy數(shù)組
Python是一種弱類型的語(yǔ)言。這就意味著,你無(wú)論何時(shí)創(chuàng)建一個(gè)新變量,都不必指定數(shù)據(jù)類型。例如,下面的內(nèi)容將自動(dòng)表示為一個(gè)整數(shù):
a?=?5輸入下面內(nèi)容以再次確認(rèn):
type(a)輸出結(jié)果:
int注意:因?yàn)闃?biāo)準(zhǔn)Python實(shí)現(xiàn)是用C編寫的,所以每個(gè)Python對(duì)象本質(zhì)上是一個(gè)偽C結(jié)構(gòu)。這對(duì)于Python中的整數(shù)也是如此,實(shí)際上它是指向復(fù)合C結(jié)構(gòu)的指針,包含的不僅僅是原始整數(shù)值。因此,用于表示Python整數(shù)的默認(rèn)C數(shù)據(jù)類型將依賴于你的系統(tǒng)架構(gòu)(即系統(tǒng)是32位還是64位平臺(tái))。
更進(jìn)一步,我們使用list()命令可以創(chuàng)建一個(gè)整數(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]類似地,我們通過(guò)讓Python遍歷整數(shù)列表int_list中的所有元素,并對(duì)每個(gè)元素應(yīng)用str()函數(shù)(該函數(shù)將一個(gè)數(shù)轉(zhuǎn)換成一個(gè)字符串),來(lái)創(chuàng)建一個(gè)字符串列表:
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中的每個(gè)元素都乘以一個(gè)因子2。執(zhí)行以下操作可能是一種簡(jiǎn)單的方法—看看輸出結(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)建了一個(gè)列表,其內(nèi)容是int_list的所有元素生成了兩次,這并不是我們想要的!
這就是NumPy的用武之地。NumPy是專為簡(jiǎn)化Python中的數(shù)組運(yùn)算而設(shè)計(jì)的。我們可以快速將整數(shù)列表轉(zhuǎn)換為一個(gè)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ù)組中的每個(gè)元素相乘會(huì)怎么樣:
int_arr?*?2輸出結(jié)果:
array([?0??2??4??6??8?10?12?14?16?18])這次我們做對(duì)了!加法、減法、除法以及很多其他運(yùn)算也是同樣的。
而且,每個(gè)NumPy數(shù)組都具有以下屬性:
ndim:維數(shù)。
shape:每一維的大小。
size:數(shù)組中元素的總數(shù)。
dtype:數(shù)組的數(shù)據(jù)類型(例如int、float、string等)。
讓我們來(lái)看看整數(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_arr?ndim:??1 int_arr?shape:??(10,) int_arr?size:??10 int_arr?dtype:??int64從這些輸出中,我們可以看到我們的數(shù)組只包含一維,其包含10個(gè)元素且所有元素都是64位的整數(shù)。當(dāng)然,如果你在32位機(jī)器上執(zhí)行這段代碼,你可能會(huì)得到dtype:int 32。
03 通過(guò)索引訪問(wèn)單個(gè)數(shù)組元素
如果你之前使用過(guò)Python的標(biāo)準(zhǔn)列表索引,那么你就不會(huì)發(fā)現(xiàn)NumPy中的索引有很多問(wèn)題。在一維數(shù)組中,通過(guò)在方括號(hào)中指定所需的索引,可以訪問(wèn)第i個(gè)值(從0開(kāi)始計(jì)算),與Python列表一樣:
int_arr輸出結(jié)果:
array([0,?1,?2,?3,?4,?5,?6,?7,?8,?9]) int_arr[0]輸出結(jié)果:
0int_arr[3]輸出結(jié)果:
3要從數(shù)組的末尾建立索引,可以使用負(fù)索引號(hào):
int_arr[-1]輸出結(jié)果:
9int_arr[-2]輸出結(jié)果:
8切割數(shù)組還有一些其他很酷的技巧,如下所示:
int_arr[2:5]?#from?index?2?up?to?index?5?-?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]訪問(wèn)數(shù)組x中的一個(gè)片段。如果沒(méi)有指定任何一個(gè)值,那么默認(rèn)值為start=0、stop=size of dimension、step=1。
04 創(chuàng)建多維數(shù)組
數(shù)組不必局限于列表。實(shí)際上,數(shù)組可以有任意維數(shù)。在機(jī)器學(xué)習(xí)中,通常我們至少要處理二維數(shù)組,列索引表示特定的特征值,行包含實(shí)際的特征值。
使用NumPy可以輕松地從頭開(kāi)始創(chuàng)建多維數(shù)組。假設(shè)我們想要?jiǎng)?chuàng)建一個(gè)3行5列的數(shù)組,所有的元素都初始化為0。如果我們不指定數(shù)據(jù)類型,NumPy將默認(rèn)使用float類型:
arr_2d?=?np.zeros((3,?5)) arr_2d輸出結(jié)果:
使用OpenCV時(shí)你可能就知道:這可以解釋為所有像素設(shè)置為0(黑色)的一個(gè)3×5的灰度圖像。例如,如果你想要?jiǎng)?chuàng)建具有3個(gè)顏色通道(R、G和B)2×4像素的一個(gè)小圖像,但是所有像素都設(shè)置為白色,我們將使用NumPy創(chuàng)建一個(gè)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ù),我們可以通過(guò)切割數(shù)組輕松地獲得第一個(gè)通道中的顏色信息:
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ù),通過(guò)指定NumPy的dtype屬性并將數(shù)組中的所有1乘以255,我們還可以創(chuàng)建一個(gè)2×4像素、全為白色的RGB圖像:
arr_uint_3d?=?np.ones((3,?2,?4),?dtype=np.uint8)?*?255 arr_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)公司的一名高級(jí)工程師,致力于解決真實(shí)世界的自動(dòng)計(jì)算機(jī)視覺(jué)問(wèn)題。曾獲得羅伯特·博世公司2019年人工智能編程馬拉松的首名。
維什韋什·拉維·什里馬利(Vishwesh Ravi Shrimali),于2018年畢業(yè)于彼拉尼博拉理工學(xué)院(BITS Pilani)機(jī)械工程專業(yè)。此后一直在BigVision LLC從事深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)方面的工作,還參與了官方OpenCV課程的創(chuàng)建。
邁克爾·貝耶勒(Michael Beyeler),是華盛頓大學(xué)神經(jīng)工程和數(shù)據(jù)科學(xué)的博士后研究員,致力于仿生視覺(jué)的計(jì)算模型研究,以為盲人植入人工視網(wǎng)膜(仿生眼睛),改善盲人的感知體驗(yàn)。他的工作屬于神經(jīng)科學(xué)、計(jì)算機(jī)工程、計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)的交叉領(lǐng)域。
本文摘編自《機(jī)器學(xué)習(xí):使用OpenCV、Python和scikit-learn進(jìn)行智能圖像處理(原書第2版)》,經(jīng)出版方授權(quán)發(fā)布。
延伸閱讀《機(jī)器學(xué)習(xí)》(原書第2版)
點(diǎn)擊上圖了解及購(gòu)買
轉(zhuǎn)載請(qǐng)聯(lián)系微信:DoctorData
推薦語(yǔ):一本基于OpenCV4和Python的機(jī)器學(xué)習(xí)實(shí)戰(zhàn)手冊(cè),既詳細(xì)介紹機(jī)器學(xué)習(xí)及OpenCV相關(guān)的基礎(chǔ)知識(shí),又通過(guò)具體實(shí)例展示如何使用OpenCV和Python實(shí)現(xiàn)各種機(jī)器學(xué)習(xí)算法,并提供大量示例代碼,可以幫助你掌握機(jī)器學(xué)習(xí)實(shí)用技巧,解決各種不同的機(jī)器學(xué)習(xí)和圖像處理問(wèn)題。
劃重點(diǎn)????
干貨直達(dá)????
為什么Siri總是像個(gè)智障?智能助手背后的技術(shù)到底有多難?
華為內(nèi)部資料流出!揭秘華為數(shù)據(jù)湖:3大特點(diǎn)、6個(gè)標(biāo)準(zhǔn)、入湖流程
中臺(tái)的本質(zhì)及中臺(tái)建設(shè)的4點(diǎn)思考
什么是YARN?跟HBase和Spark比優(yōu)勢(shì)在哪?終于有人講明白了
更多精彩????
在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
查看更多優(yōu)質(zhì)內(nèi)容!
PPT?|?讀書?|?書單?|?硬核?|?干貨?|?講明白?|?神操作
大數(shù)據(jù)?|?云計(jì)算?|?數(shù)據(jù)庫(kù)?|?Python?|?可視化
AI?|?人工智能?|?機(jī)器學(xué)習(xí)?|?深度學(xué)習(xí)?|?NLP
5G?|?中臺(tái)?|?用戶畫像?|?1024?|?數(shù)學(xué)?|?算法?|?數(shù)字孿生
據(jù)統(tǒng)計(jì),99%的大咖都完成了這個(gè)神操作
????
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的手把手教你用Python的NumPy包处理数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大龄程序员想转产品经理?3本书给你最靠谱
- 下一篇: 为什么Spark能成为最火的大数据计算引