NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具
導(dǎo)讀:NumPy(Numerical Python的簡(jiǎn)稱(chēng))是高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ)包,提供了矩陣運(yùn)算的功能。
在處理自然語(yǔ)言過(guò)程中,需要將文字(中文或其他語(yǔ)言)轉(zhuǎn)換為向量。即把對(duì)文本內(nèi)容的處理簡(jiǎn)化為向量空間中的向量運(yùn)算。基于向量運(yùn)算,我們就可以實(shí)現(xiàn)文本語(yǔ)義相似度、特征提取、情感分析、文本分類(lèi)等功能。
作者:涂銘,劉祥,劉樹(shù)春
如需轉(zhuǎn)載請(qǐng)聯(lián)系大數(shù)據(jù)(ID:hzdashuju)
NumPy提供了以下幾個(gè)主要功能:
ndarray——一個(gè)具有向量算術(shù)運(yùn)算和復(fù)雜廣播能力的多維數(shù)組對(duì)象。
用于對(duì)數(shù)組數(shù)據(jù)進(jìn)行快速運(yùn)算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)。
用于讀寫(xiě)磁盤(pán)數(shù)據(jù)的工具以及用于操作內(nèi)存映射文件的工具。
非常有用的線性代數(shù),傅里葉變換和隨機(jī)數(shù)操作。
用于集成C /C++和Fortran代碼的工具。
除明顯的科學(xué)用途之外,NumPy也可以用作通用數(shù)據(jù)的高效多維容器,可以定義任意的數(shù)據(jù)類(lèi)型。這些使得NumPy能無(wú)縫、快速地與各種數(shù)據(jù)庫(kù)集成。
提示:這里提到的“廣播”可以這么理解:當(dāng)有兩個(gè)維度不同的數(shù)組(array)運(yùn)算的時(shí)候,可以用低維的數(shù)組復(fù)制成高維數(shù)組參與運(yùn)算(因?yàn)镹umPy運(yùn)算的時(shí)候需要結(jié)構(gòu)相同)。
本文NumPy的要點(diǎn)包括:
創(chuàng)建NumPy數(shù)組
獲取NumPy中數(shù)組的維度
NumPy數(shù)組索引與切片
NumPy數(shù)組比較
替代值
NumPy數(shù)據(jù)類(lèi)型轉(zhuǎn)換
NumPy的統(tǒng)計(jì)計(jì)算方法
01 創(chuàng)建數(shù)組
在NumPy中,最核心的數(shù)據(jù)結(jié)構(gòu)是ndarray,ndarray代表的是多維數(shù)組,數(shù)組指的是數(shù)據(jù)的集合。為了方便理解,我們來(lái)舉一個(gè)小例子。
1. 一個(gè)班級(jí)里學(xué)生的學(xué)號(hào)可以通過(guò)一維數(shù)組來(lái)表示:數(shù)組名叫a,在a中存儲(chǔ)的是數(shù)值類(lèi)型的數(shù)據(jù),分別是1,2,3,4。
索引 | 學(xué)號(hào) |
0 | 1 |
1 | 2 |
2 | 3 |
3 | 4 |
其中a[0]代表的是第一個(gè)學(xué)生的學(xué)號(hào)1,a[1]代表的是第二個(gè)學(xué)生的學(xué)號(hào)2,以此類(lèi)推。
2. 一個(gè)班級(jí)里學(xué)生的學(xué)號(hào)和姓名,則可以用二維數(shù)組來(lái)表示:數(shù)組名叫b
1 | Tim |
2 | Joey |
3 | Johnny |
4 | Frank |
類(lèi)似的,其中b[0,0]代表的就是1(學(xué)號(hào)),b[0,1]代表的就是Tim(學(xué)號(hào)為1的學(xué)生的名字),以此類(lèi)推b[1,0]代表的是2(學(xué)號(hào))等。
借用線性代數(shù)的說(shuō)法,一維數(shù)組通常稱(chēng)為向量(vector),二維數(shù)組通常稱(chēng)為矩陣(matrix)。
當(dāng)我們安裝完Anaconda之后,默認(rèn)情況下NumPy已經(jīng)在庫(kù)中了,所以不需要額外安裝。我們來(lái)寫(xiě)一些語(yǔ)句簡(jiǎn)單測(cè)試下NumPy:
1)在Anaconda中輸入,如果沒(méi)有報(bào)錯(cuò),那么說(shuō)明NumPy是正常工作的。
稍微解釋下這句語(yǔ)句:通過(guò)import關(guān)鍵字將NumPy庫(kù)引入,然后通過(guò)as為其取一個(gè)別名np,別名的作用是為了之后寫(xiě)代碼的時(shí)候方便引用。
2)通過(guò)NumPy中的array(),可以將向量直接導(dǎo)入:
3)通過(guò)numpy.array()方法,也可以將矩陣導(dǎo)入:
02 獲取NumPy中數(shù)組的維度
首先我們通過(guò)NumPy中的一個(gè)方法arange(n),生成0到n-1的數(shù)組。比如我們輸入np.arange(15),可以看到返回的結(jié)果是array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])。
之后再通過(guò)NumPy中的reshape(row,column)方法,自動(dòng)構(gòu)架一個(gè)多行多列的array對(duì)象。
比如我們輸入:
可以看到結(jié)果:
???????[?5,??6,??7,??8,??9],
???????[10,?11,?12,?13,?14]])
我們有了基本數(shù)據(jù)之后,可以通過(guò)NumPy提供的shape屬性獲取NumPy數(shù)組的維度。
可以看到返回的結(jié)果,這個(gè)是一個(gè)元組(tuple),第一個(gè)3代表的是3行,第二個(gè)5代表的是5列:
03 獲取本地?cái)?shù)據(jù)
我們可以通過(guò)NumPy中g(shù)enfromtxt()方法來(lái)讀取本地的數(shù)據(jù)集。需要使用的數(shù)據(jù)集,house-prices.csv是由逗號(hào)(,)分隔的,在Github的data目錄下能下載到。我們可以使用以下語(yǔ)句來(lái)讀取這個(gè)數(shù)據(jù)集:
nfl?=?np.genfromtxt("D:/numpy/data/price.csv",?delimiter=",")
print(nfl)
上述代碼從本地讀取price.csv文件到NumPy數(shù)組對(duì)象中(ndarray),我們看一下數(shù)據(jù)集的前幾行。
?????????????????nan??????????????nan]
????[??1.00000000e+00??1.14300000e+05??2.00000000e+00??2.00000000e+00
?????????????????nan??????????????nan]
????[??2.00000000e+00??1.14200000e+05??4.00000000e+00??2.00000000e+00
?????????????????nan??????????????nan]
????[??3.00000000e+00??1.14800000e+05??3.00000000e+00??2.00000000e+00
?????????????????nan??????????????nan]
????[??4.00000000e+00??9.47000000e+04??3.00000000e+00??2.00000000e+00
?????????????????nan??????????????nan]
暫時(shí)先不用考慮返回?cái)?shù)據(jù)中出現(xiàn)的nan。
每一行的數(shù)據(jù)代表了房間的地區(qū),是否是磚瓦結(jié)構(gòu),有多少臥室、洗手間以及價(jià)格的描述。
每個(gè)列代表了:
Home:房子的id
Price:房子的價(jià)格
Bedrooms:有多少個(gè)臥室
Bathroom:有多少個(gè)洗手間
Brick:是否是磚房
Neighborhood:地區(qū)
注意:NumPy數(shù)組中的數(shù)據(jù)必須是相同類(lèi)型,比如布爾類(lèi)型(bool)、整型(int),浮點(diǎn)型(float)以及字符串類(lèi)型(string)。NumPy可以自動(dòng)判斷數(shù)組內(nèi)的對(duì)象類(lèi)型,我們可以通過(guò)NumPy數(shù)組提供的dtype屬性來(lái)獲取類(lèi)型。
04 正確讀取數(shù)據(jù)
回到之前的話題,上文發(fā)現(xiàn)顯示出來(lái)的數(shù)據(jù)里面有數(shù)據(jù)類(lèi)型na(not available)和nan(not a number),前者表示讀取的數(shù)值是空的、不存在的,后者是因?yàn)閿?shù)據(jù)類(lèi)型轉(zhuǎn)換出錯(cuò)。對(duì)于nan的出錯(cuò),我們可以用genfromtxt()來(lái)轉(zhuǎn)化數(shù)據(jù)類(lèi)型。
dtype關(guān)鍵字要設(shè)定為‘U75’.表示每個(gè)值都是75byte的unicode。
skip_header關(guān)鍵字可以設(shè)置為整數(shù),這個(gè)參數(shù)可以跳過(guò)文件開(kāi)頭的對(duì)應(yīng)的行數(shù),然后再執(zhí)行任何其他操作。
nfl?=?np.genfromtxt("d:/numpy/data/price.csv",?dtype='U75',?skip_header?=?1,delimiter=",")
print(nfl)
05 NumPy數(shù)組索引
NumPy支持list一樣的定位操作。舉例來(lái)說(shuō):
matrix?=?np.array([[1,2,3],[20,30,40]])
print(matrix[0,1])
得到的結(jié)果是2。
上述代碼中的matrix[0,1],其中0代表的是行,在NumPy中0代表起始第一個(gè),所以取的是第一行,之后的1代表的是列,所以取的是第二列。那么最后第一行第二列就是2這個(gè)值了。
06 切片
NumPy支持list一樣的切片操作。
matrix?=?np.array([
[5,?10,?15],?
????[20,?25,?30],
????[35,?40,?45]
????])
print(matrix[:,1])
print(matrix[:,0:2])
print(matrix[1:3,:])
print(matrix[1:3,0:2])
上述的print(matrix[:,1])語(yǔ)法代表選擇所有的行,但是列的索引是1的數(shù)據(jù)。那么就返回10,25,40。
print(matrix[:,0:2])代表的是選取所有的行,列的索引是0和1。
print(matrix[1:3,:])代表的是選取行的索引值1和2以及所有的列。
print(matrix[1:3,0:2])代表的是選取行的索引1和2以及列的索引是0和1的所有數(shù)據(jù)。
07 數(shù)組比較
NumPy強(qiáng)大的地方是數(shù)組或矩陣的比較,數(shù)據(jù)比較之后會(huì)產(chǎn)生boolean值。
舉例來(lái)說(shuō):
matrix?=?np.array([
????[5,?10,?15],
[20,?25,?30],
[35,?40,?45]
])
m?=?(matrix?==?25)
print(m)
我們看到輸出的結(jié)果為:
????[False??True?False]
????[False?False?False]]
我們?cè)賮?lái)看一個(gè)比較復(fù)雜的例子:
matrix?=?np.array([
[5,?10,?15],
[20,?25,?30],
[35,?40,?45]
????])
second_column_25?=?(matrix[:,1]?==?25)
print(second_column_25)
print(matrix[second_column_25,?:])
上述代碼中print(second_column_25)輸出的是[False True False],首先matrix[:,1]代表的是所有的行,以及索引為1的列->[10,25,40],最后和25進(jìn)行比較,得到的就是false,true,false。print(matrix[second_column_25, :])代表的是返回true值的那一行數(shù)據(jù)-> [20,25,30]。
注意:上述的例子是單個(gè)條件,NumPy也允許我們使用條件符來(lái)拼接多個(gè)條件,其中“&”代表的是“且”,“|”代表的是“或”。比如vector=np.array([5,10,11,12]),equal_to_five_and_ten =(vector == 5) & (vector == 10)返回的都是false,如果是equal_to_five_or_ten =(vector == 5)|(vector == 10)返回的是[True,True,False,False]
08 替代值
NumPy可以運(yùn)用布爾值來(lái)替換值。
在數(shù)組中:
equal_to_ten_or_five?=?(vector?==?10)?|?(vector?==?5)
vector[equal_to_ten_or_five]?=?50
print(vector)
[50,?50,?15,?20]
在矩陣中:
[5,?10,?15],
[20,?25,?30],
[35,?40,?45]
])
second_column_25?=?matrix[:,1]?==?25
matrix[second_column_25,?1]?=?10
print(matrix)
[[?5?10?15]
????[20?10?30]
????[35?40?45]]
我們先創(chuàng)立數(shù)組matrix。將matrix的第二列和25比較,得到一個(gè)布爾值數(shù)組。second_column_25將matrix第二列值為25的替換為10。
替換有一個(gè)很棒的應(yīng)用之處,就是替換那些空值。之前提到過(guò)NumPy中只能有一個(gè)數(shù)據(jù)類(lèi)型。我們現(xiàn)在讀取一個(gè)字符矩陣,其中有一個(gè)值為空值。其中的空值我們很有必要把它替換成其他值,比如數(shù)據(jù)的平均值或者直接把他們刪除。這在大數(shù)據(jù)處理中很有必要。這里,我們演示把空值替換為“0”的操作。
matrix?=?np.array([
['5',?'10',?'15'],
['20',?'25',?'30'],
['35',?'40',''?]
????])
second_column_25?=?(matrix[:,2]?==?'')
matrix[second_column_25,?2]='0'
print(matrix)
09 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
NumPy ndarray數(shù)據(jù)類(lèi)型可以通過(guò)參數(shù)dtype 設(shè)定,而且可以使用astype轉(zhuǎn)換類(lèi)型,在處理文件時(shí)這個(gè)會(huì)很實(shí)用,注意astype 調(diào)用會(huì)返回一個(gè)新的數(shù)組,也就是原始數(shù)據(jù)的一份復(fù)制。
比如,把String轉(zhuǎn)換成float。如下:
vector?=?vector.astype(float)
注意:上述例子中,如果字符串中包含非數(shù)字類(lèi)型的時(shí)候,從string轉(zhuǎn)float就會(huì)報(bào)錯(cuò)。
10 NumPy的統(tǒng)計(jì)計(jì)算方法
NumPy內(nèi)置很多計(jì)算方法。其中最重要的統(tǒng)計(jì)方法有:
sum():計(jì)算數(shù)組元素的和;對(duì)于矩陣計(jì)算結(jié)果為一個(gè)一維數(shù)組,需要指定行或者列。
mean():計(jì)算數(shù)組元素的平均值;對(duì)于矩陣計(jì)算結(jié)果為一個(gè)一維數(shù)組,需要指定行或者列。
max():計(jì)算數(shù)組元素的最大值;對(duì)于矩陣計(jì)算結(jié)果為一個(gè)一維數(shù)組,需要指定行或者列。
需要注意的是,用于這些統(tǒng)計(jì)方法計(jì)算的數(shù)值類(lèi)型必須是int或者float。
數(shù)組例子:
vector.sum()
#得到的結(jié)果是50
矩陣?yán)?#xff1a;
array([[?5,?10,?15],
??????????[20,?10,?30],
??????????[35,?40,?45]])
matrix.sum(axis=1)
array([?30,??60,?120])
matrix.sum(axis=0)
array([60,?60,?90])
如上述例子所示,axis = 1計(jì)算的是行的和,結(jié)果以列的形式展示。axis = 0計(jì)算的是列的和,結(jié)果以行的形式展示。
延伸學(xué)習(xí)
官方推薦教程是不錯(cuò)的入門(mén)選擇:
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
關(guān)于作者:涂銘,阿里巴巴數(shù)據(jù)架構(gòu)師,對(duì)大數(shù)據(jù)、自然語(yǔ)言處理、Python、Java相關(guān)技術(shù)有深入的研究,積累了豐富的實(shí)踐經(jīng)驗(yàn)。
劉祥,百煉智能自然語(yǔ)言處理專(zhuān)家,主要研究知識(shí)圖譜、NLG等前沿技術(shù),參與機(jī)器自動(dòng)寫(xiě)作產(chǎn)品的研發(fā)與設(shè)計(jì)。
劉樹(shù)春,七牛云高級(jí)算法專(zhuān)家,七牛AI實(shí)驗(yàn)室NLP&OCR方向負(fù)責(zé)人,主要負(fù)責(zé)七牛NLP以及OCR相關(guān)項(xiàng)目的研究與落地。
本文摘編自《Python自然語(yǔ)言處理實(shí)戰(zhàn):核心技術(shù)與算法》,經(jīng)出版方授權(quán)發(fā)布。
延伸閱讀《Python自然語(yǔ)言處理實(shí)戰(zhàn)》
點(diǎn)擊上圖了解及購(gòu)買(mǎi)
轉(zhuǎn)載請(qǐng)聯(lián)系微信:togo-maruko
推薦語(yǔ):阿里巴巴、前明略數(shù)據(jù)和七牛云的高級(jí)專(zhuān)家和科學(xué)家撰寫(xiě),零基礎(chǔ)掌握NLP的核心技術(shù)、方法論和經(jīng)典算法。
據(jù)統(tǒng)計(jì),99%的大咖都完成了這個(gè)神操作
▼
更多精彩
在公眾號(hào)后臺(tái)對(duì)話框輸入以下關(guān)鍵詞
查看更多優(yōu)質(zhì)內(nèi)容!
PPT?|?報(bào)告?|?讀書(shū)?|?書(shū)單
大數(shù)據(jù)?|?揭秘?|?人工智能?|?AI
Python?|?機(jī)器學(xué)習(xí)?|?深度學(xué)習(xí)?|?神經(jīng)網(wǎng)絡(luò)
可視化?|?區(qū)塊鏈?|?干貨?|?數(shù)學(xué)
猜你想看
白領(lǐng)體檢異常率連年走高,這5本書(shū)教你怎樣科學(xué)"養(yǎng)生"
跟著阿里大牛撈干貨:2019這5本書(shū)帶你玩轉(zhuǎn)大數(shù)據(jù)
學(xué)AI哪家強(qiáng)?清華全球第1,Top5中有這3所中國(guó)高校
過(guò)去的2018年,400000粉絲用指尖投票,選出了這10本技術(shù)書(shū)
Q:?你在用NumPy嗎?都用來(lái)做什么?
歡迎留言與大家分享
覺(jué)得不錯(cuò),請(qǐng)把這篇文章分享給你的朋友
轉(zhuǎn)載 / 投稿請(qǐng)聯(lián)系:baiyu@hzbook.com
更多精彩,請(qǐng)?jiān)诤笈_(tái)點(diǎn)擊“歷史文章”查看
點(diǎn)擊閱讀原文,了解更多
總結(jié)
以上是生活随笔為你收集整理的NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 3个最常见案例详解DBA日常维护
- 下一篇: 刘慈欣推荐!这本“疯狂的书”预言9年后人