讀古今文學網 > 機器學習實戰 > A.3 NumPy快速入門 >

A.3 NumPy快速入門

NumPy庫安裝完成後,讀者可能在想:「這東西有什麼好處?」正式來說,NumPy是Python的一個矩陣類型,提供了大量矩陣處理的函數。非正式來說,它是一個使運算更容易、執行更迅速的庫,因為它的內部運算是通過C語言而不是Python實現的。 儘管聲稱是一個關於矩陣的庫,NumPy實際上包含了兩種基本的數據類型:數組和矩陣。二者在處理上稍有不同。如果讀者熟悉MATLABTM的話,矩陣的處理將不是難事。在使用標準的Python時,處理這兩種數據類型均需要循環語句。而在使用NumPy時則可以省去這些語句。下面是數組處理的一些例子:

>>> from numpy import array
>>> mm=array((1, 1, 1))
>>> pp=array((1, 2, 3))
>>> pp+mm
array([2, 3, 4]) 
  

而如果只用常規Python的話,完成上述功能需要使用for循環。 另外在Python中還有其他一些需要循環的處理過程,例如在每個元素上乘以常量2,而在NumPy下就可以寫成:

>>> pp*2
array([2, 4, 6])    
  

還有對每個元素平方:

>>> pp**2
array([1, 4, 9])  
  

可以像列表中一樣訪問數組裡的元素:

>>> pp[1]
2
  

NumPy中也支持多維數組:

>>> jj = array([[1, 2, 3], [1, 1, 1]])
  

多維數組中的元素也可以像列表中一樣訪問:

>>> jj[0]
array([1, 2, 3])
>>> jj[0][1]
2 
  

也可以用矩陣方式訪問:

>>> jj[0,1]
2 
  

當把兩個數組乘起來的時候,兩個數組的元素將對應相乘:

>>> a1=array([1, 2,3])
>>> a2=array([0.3, 0.2, 0.3])
>>> a1*a2
array([ 0.3, 0.4, 0.9])  
  

下面來介紹矩陣。

與使用數組一樣,需要從NumPy中導入matrix或者mat模塊:

>>> from numpy import mat, matrix
  

上述NumPy中的關鍵字matmatrix的縮寫。

>>> ss = mat([1, 2, 3])
>>> ss
matrix([[1, 2, 3]])
>>> mm = matrix([1, 2, 3])
>>> mm
matrix([[1, 2, 3]])  
  

可以訪問矩陣中的單個元素:

>>> mm[0, 1]
2 
  

可以把Python列表轉換成NumPy矩陣:

>>> pyList = [5, 11, 1605]
>>> mat(pyList)
matrix([[ 5, 11, 1605]]) 
  

現在試試將上述兩個矩陣相乘:

>>> mm*ss
Traceback (most recent call last):
    File \"<stdin>\", line 1, in <module>
    File \"c:Python27libsite-packagesnumpymatrixlibdefmatrix.py\",
line 330, i
n __mul__
    return N.dot(self, asmatrix(other))
ValueError: objects are not aligned 
  

可以看到出現了一個錯誤:乘法不能執行。矩陣數據類型的運算會強制執行數學中的矩陣運算,1×3的矩陣是不能與1×3的矩陣相乘的(左矩陣的列數和右矩陣的行數必須相等)。這時需要將其中一個矩陣轉置,使得可以用3×1的矩陣乘以1×3的矩陣,或者是1×3的矩陣乘以3×1的矩陣。NumPy數據類型有一個轉置方法,因此可以很方便地進行矩陣乘法運算:

>>> mm*ss.T
matrix([[14]])  
  

這裡調用了.T方法完成了ss的轉置。 知道矩陣的大小有助於上述對齊錯誤的調試,可以通過NumPy中的shape方法來查看矩陣或者數組的維數:

>>> from numpy import shape
>>> shape(mm)
(1, 3) 
  

如果需要把矩陣mm的每個元素和矩陣ss的每個元素對應相乘應該怎麼辦呢?這就是所謂的元素相乘法,可以使用NumPy的multiply方法:

>>> from numpy import multiply
>>> multiply(mm, ss)
matrix([[1, 4, 9]])  
  

此外,矩陣和數組還有很多有用的方法,如排序:

>>> mm.sort
>>> mm
matrix([[1, 2, 3]]) 
  

注意該方法是原地排序(即排序後的結果佔用原始的存儲空間),所以如果希望保留數據的原序,必須事先做一份拷貝。也可以使用argsort方法得到矩陣中每個元素的排序序號:

>>> dd=mat([4, 5, 1])
>>> dd.argsort
matrix([[2, 0, 1]])  
  

可以計算矩陣的均值:

>>> dd.mean
3.3333333333333335  
  

再回顧一下多維數組:

>>> jj = mat([[1, 2, 3,], [8, 8, 8]])
>>> shape(jj)
(2, 3)
  

這是一個2×3的矩陣,如果想取出其中一行的元素,可以使用冒號( :)操作符和行號來完成。例如,要取出第一行元素,應該輸入:

>>> jj[1,:]
matrix([[8, 8, 8]])
  

還可以指定要取出元素的範圍。如果想得到第一行第0列和第1列的元素,可以使用下面的語句:

>>> jj[1,0:2]
matrix([[8, 8]])  
  

這種索引方法能夠簡化NumPy的編程。 在數組和矩陣數據類型之外,NumPy還提供了很多其他有用的方法。我建議讀者瀏覽完整的官方文檔http://docs.scipy.org/doc/。