導讀: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是正常工作的。
In [1]: import numpy as np
稍微解釋下這句陳述句:透過import關鍵字將NumPy庫引入,然後透過as為其取一個別名np,別名的作用是為了之後寫程式碼的時候方便取用。
2)透過NumPy中的array(),可以將向量直接匯入:
vector = np.array([1,2,3,4])
3)透過numpy.array()方法,也可以將矩陣匯入:
matrix = np.array([[1,'Tim'],[2,'Joey'],[3,'Johnny'],[4,'Frank']])
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物件。
比如我們輸入:
a = np.arange(15).reshape(3,5) #代表3行5列
可以看到結果:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
我們有了基本資料之後,可以透過NumPy提供的shape屬性獲取NumPy陣列的維度。
print(a.shape)
可以看到傳回的結果,這個是一個元組(tuple),第一個3代表的是3行,第二個5代表的是5列:
(3, 5)
03 獲取本地資料
我們可以透過NumPy中genfromtxt()方法來讀取本地的資料集。需要使用的資料集,house-prices.csv是由逗號(,)分隔的,在Github的data目錄下能下載到。我們可以使用以下陳述句來讀取這個資料集:
import numpy as np
nfl = np.genfromtxt("D:/numpy/data/price.csv", delimiter=",")
print(nfl)
上述程式碼從本地讀取price.csv檔案到NumPy陣列物件中(ndarray),我們看一下資料集的前幾行。
[[ nan nan nan nan
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_essay-header關鍵字可以設定為整數,這個引數可以跳過檔案開頭的對應的行數,然後再執行任何其他操作。
import numpy as np
nfl = np.genfromtxt("d:/numpy/data/price.csv", dtype='U75', skip_essay-header = 1,delimiter=",")
print(nfl)
05 NumPy陣列索引
NumPy支援list一樣的定位操作。舉例來說:
import numpy as np
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一樣的切片操作。
import numpy as np
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值。
舉例來說:
import numpy as np
matrix = np.array([
[5, 10, 15],
[20, 25, 30],
[35, 40, 45]
])
m = (matrix == 25)
print(m)
我們看到輸出的結果為:
[[False False False]
[False True False]
[False False False]]
我們再來看一個比較複雜的例子:
import numpy as np
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可以運用布林值來替換值。
在陣列中:
vector = numpy.array([5, 10, 15, 20])
equal_to_ten_or_five = (vector == 10) | (vector == 5)
vector[equal_to_ten_or_five] = 50
print(vector)
[50, 50, 15, 20]
在矩陣中:
matrix = numpy.array([
[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”的操作。
import numpy as np
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 = numpy.array(["1", "2", "3"])
vector = vector.astype(float)
註意:上述例子中,如果字串中包含非數字型別的時候,從string轉float就會報錯。
10 NumPy的統計計算方法
NumPy內建很多計算方法。其中最重要的統計方法有:
-
sum():計算陣列元素的和;對於矩陣計算結果為一個一維陣列,需要指定行或者列。
-
mean():計算陣列元素的平均值;對於矩陣計算結果為一個一維陣列,需要指定行或者列。
-
max():計算陣列元素的最大值;對於矩陣計算結果為一個一維陣列,需要指定行或者列。
需要註意的是,用於這些統計方法計算的數值型別必須是int或者float。
陣列例子:
vector = numpy.array([5, 10, 15, 20])
vector.sum()
#得到的結果是50
矩陣例子:
matrix=
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 | 機器學習 | 深度學習 | 神經網路
視覺化 | 區塊鏈 | 乾貨 | 數學
猜你想看
Q: 你在用NumPy嗎?都用來做什麼?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉載 / 投稿請聯絡:baiyu@hzbook.com
更多精彩,請在後臺點選“歷史文章”檢視
點選閱讀原文,瞭解更多