Numpy是專門爲數據科學或者數據處理相關的需求設計的一個高效的組件。聽起來是否是挺繞口的,其實簡單來講就2個方面,一是Numpy是專門處理數據的,二是Numpy在處理數據方面很牛逼(確定比Python原生組件牛逼,不然也不會另外再來搞個Numpy了吧)。其實更加細化的來看其實Numpy最經常使用的就是矩陣(Matrix)的處理。如何有一點數據處理方面的經驗的話,不管你每一條數據有多少個features(特徵),它終究是一個二維的矩陣。因此Numpy在數據處理方面是很是經常使用的。就是簡單點理解就是Numpy其實就是封裝了Python中的list,Numpy其實就是一個high level的List而已,它沒有什麼牛逼的,底層仍是Python。好了,閒話少扯了,上面的我我的以爲說的有點小囉嗦了,容易把人搞暈了。我們仍是直接看看下面的例子,看看Numpy的建立,索引,函數吧。下面並不包括Numpy的全部功能,具體不少細節,你們要學會看文檔,下面的內容主要介紹一些最基本最經常使用的一些功能,下面的內容只是一個方向指導做用,具體在業務需求中須要用到什麼API麻煩仍是要你們本身去找文檔查看吧。api
好了,既然我們這裏要說說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的牛逼之處,就不得不說它提供了豐富的API來快速簡單的操做matrix。首先來介紹一下最經常使用的properties:transpose(T)和shape。這兩個properties(不是我裝逼,真是忘了中文翻譯是啥了,應該叫成員變量仍是啥的)。若是你想轉置一個矩陣,下面一行代碼搞定spa
a = np.array([[1,2,3],[4,5,6]]) print(a.T)#transpose of matrix a
一行代碼搞定矩陣的轉置,方便吧,上面代碼返回值以下:scala
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)
上面的返回值分別是code
array([[1, 2], [3, 4], [5, 6]]) array([[1], [2], [3], [4], [5], [6]])
這個功能是否是很牛逼呢。哈哈。。
既然是矩陣,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的形式和思路就行,不是把上面的內容死記硬背下來,那樣沒有意義,關鍵是一種學習的方法和學習的能力。把基本功練紮實了,我們才能一塊兒一路打怪升級。