歡迎光臨
每天分享高質量文章

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是正常工作的。

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],
       [1011121314]])

我們有了基本資料之後,可以透過NumPy提供的shape屬性獲取NumPy陣列的維度。

print(a.shape)

可以看到傳回的結果,這個是一個元組(tuple),第一個3代表的是3行,第二個5代表的是5列:

(35)

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([
[51015], 
    [202530],
    [354045]
    ])
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([
    [51015],
[202530],
[354045]
])
m = (matrix == 25)
print(m)

我們看到輸出的結果為:

[[False False False]
    [False  True False]
    [False False False]]

我們再來看一個比較複雜的例子:

import numpy as np
matrix = np.array([
[51015],
[202530],
[354045]
    ])
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([5101520])
equal_to_ten_or_five = (vector == 10) | (vector == 5)
vector[equal_to_ten_or_five] = 50
print(vector)
[50501520]

在矩陣中:

matrix = numpy.array([
[51015],
[202530],
[354045]
])
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([5101520])
vector.sum()
#得到的結果是50

矩陣例子:

matrix=
array([[ 51015],
          [201030],
          [354045]])
matrix.sum(axis=1)
array([ 30,  60120])
matrix.sum(axis=0)
array([606090])

如上述例子所示,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

更多精彩,請在後臺點選“歷史文章”檢視

點選閱讀原文,瞭解更多

贊(0)

分享創造快樂