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