機器學習- Numpy基礎 吐血整理
Numpy是專門為資料科學或者資料處理相關的需求設計的一個高效的元件。聽起來是不是挺繞口的,其實簡單來說就2個方面,一是Numpy是專門處理資料的,二是Numpy在處理資料方面很牛逼(肯定比Python原生元件牛逼,否則也不會另外再來搞個Numpy了吧)。其實更加細化的來看其實Numpy最常用的就是矩陣(Matrix)的處理。如何有一點資料處理方面的經驗的話,無論你每一條資料有多少個features(特徵),它終究是一個二維的矩陣。所以Numpy在資料處理方面是非常常用的。就是簡單點理解就是Numpy其實就是封裝了Python中的list,Numpy其實就是一個high level的List而已,它沒有什麼牛逼的,底層還是Python。好了,閒話少扯了,上面的我個人覺得說的有點小囉嗦了,容易把人搞暈了。咱們還是直接看看下面的例子,看看Numpy的建立,索引,函式吧。下面並不包括Numpy的所有功能,具體很多細節,大家要學會看文件,下面的內容主要介紹一些最基本最常用的一些功能,下面的內容只是一個方向指導作用,具體在業務需求中需要用到什麼API麻煩還是要大家自己去找文件檢視吧。
- Numpy的建立和結構分析
好了,既然咱們這裡要說說Numpy,那咱們就肯定得先有一個Numpy物件啊(如果不知道啥叫物件,麻煩大家直接去看Hello world). 建立Numpy物件的步驟是先匯入Numpy庫,然後直接呼叫array()方法。詳情請看下面的例項。
import numpy as np w = np.array([3,0,5])#w is a numpy array type(w)
上面的程式碼例項其實就是建立了一個numpy,注意它這裡的w的型別已經不是list了,而是ndarray(其實就是numpy data array 的簡稱)。 w的值也是array([3,0,5])了,而不是直接的[3,0,5]。這裡直接就從表象(也就是最直觀的方面)區別了numpy array和list的區別了。為了更加直觀的展現numpy的結構,下面再用一個二維陣列的例子來說明。
a = np.array([[1,2],[3,4],[5,6]])#a is a 2-dimensional numpy array print(a)
上面這是一個二維的Numpy array。其實如果你仔細看,她就是把Python中的list作為引數傳遞給了numpy.array()這個方法。a的值如下所示
array([[1, 2], [3, 4], [5, 6]])
到目前為止,大家肯定心裡犯嘀咕了,這TM也沒有什麼牛逼的啊,比Python中的list搞得還複雜,畢竟Python中的list也可以是一維的也可以是多維的,而且表現形式還更加簡單快速,還更加底層,因而執行速度也更加快。如果僅僅是這麼簡單,說明你們還是太天真,很傻很可愛。哈哈哈哈哈哈,下面我就來說說社會主義的優越性(錯了,是Numpy在資料處理中的優越性)
- Numpy中常用的properties和method
要說Numpy的牛逼之處,就不得不說它提供了豐富的API來快速簡單的操作matrix。首先來介紹一下最常用的properties:transpose(T)和shape。這兩個properties(不是我裝逼,真是忘了中文翻譯是啥了,應該叫成員變數還是啥的)。如果你想轉置一個矩陣,下面一行程式碼搞定
a = np.array([[1,2,3],[4,5,6]]) print(a.T)#transpose of matrix a
一行程式碼搞定矩陣的轉置,方便吧,上面程式碼返回值如下:
array([[1, 4], [2, 5], [3, 6]])
另外一個重要的特性就是shape啦。這個關鍵字可以直接返回矩陣的row 和 column,在進行資料預處理前,瞭解資料的這些特性,可以非常有效的幫助我們瞭解資料。例如上面我們的a是一個2行3列的矩陣,那麼下面的程式碼就返回(2,3)
a.shape #return a tuple (2,3)
另外,Numpy中有一個非常常用的函式叫做reshape(),它的引數分別是row和column的數量,記住reshape前後,元素的數量要一致,否則會報錯。什麼意思呢,就是加入一個矩陣a是2*3的矩陣,那麼你可以reshape(3,2)或者reshape(6,1),如果你reshape(2,1)它就會報錯。還是那上面的例子吧,參看下面的例子
a1 = a.reshape(3,2) a2 = a.reshape(6,1)
上面的返回值分別是
array([[1, 2], [3, 4], [5, 6]]) array([[1], [2], [3], [4], [5], [6]])
這個功能是不是很牛逼呢。哈哈。。
- Index 和 slicing
既然是矩陣,indexing和slicing應該是經常要用到的,在機器學習中,尤其是slicing更是幾乎都要用到。首先index的話,既可以直接索引一個元素,也可以索引一行資料或者一列資料。具體的例項如下所示
a = np.array([[1,2,3],[4,5,6]]) #create a 2d numpy array a[0,1]#retrieve the element in the numpy array a with the index of (row = 0, column = 1) a[0]#retrieve the first row of the matrix a, the effect is the same as a[0,:] a[:,1]#retrieve the second column of the matrix a
具體的程式碼解釋就看看上面的註釋就行了。這裡需要解釋一下細節部分就是上面a[0,1]返回的是一個scalar(實數),a[0]和a[:,1]返回的都是一維numpy陣列,即使是取的第二列資料,也是一維的而不是二維的。即上面程式碼的返回值如下:
2 array([1,2,3]) array([2,5])
對於slicing而言,她的返回值的維數始終等於原陣列的維數,這句話啥意思呢,簡單來說,slicing分割出來的結果,哪怕只是分割一個元素,它的維數也是跟原陣列的維數一樣。例如分割一個二維陣列,無論你怎麼分割,它的結果都是二維的。這是跟index最大的一個區別。slicing 的結構是 array[row_start:row_end, column_start:column_end]. 具體的例項如下所示
a[0:1,:]# return the first row, 2d array a[:,0:1]# return the first column, 2d array a[0:1,0:1]#return the cross of first row and first column, it is still a 2d numpy array though is a single element
看看上面的分割例子,第一個是隻沿著row的方向分割,第二個是隻沿著column的方向分割,第三個是即沿著row也沿著column的方向分割。他們的結果的structure都是和a的structure一樣,都是二維的。結果如下:
array([[1, 2, 3]]) array([[1], [4]]) array([[1]])
總結:最後國際慣例都來個大總結啦。其實在機器學習中numpy的常用用法就上面這些,例如建立,index,slicing,transpose和reshape。這些方法和應用場景是最常見的。雖然前面說了這麼多numpy的介紹,但是numpy的庫博大精深,數以萬計的api等待著大家去探索。哈哈哈,莫慌莫慌。隨後numpy相當於封裝了Python中的list,但是在後面你們會看見,機器學習的實踐中直接操作numpy的機率比較少,因為後面還有更牛逼的處理資料的庫,那就是大boss---pandas。 你們也可以理解pandas是對numpy的進一步抽象和封裝,使用起來更加方便快捷。所以大家先理解,記住關鍵是理解numpy的形式和思路就行,不是把上面的內容死記硬背下來,那樣沒有意義,關鍵是一種學習的方法和學習的能力。把基本功練紮實了,咱們才能一起一路打怪升