資深專家分享:從numpy開啟Python資料科學之旅!

趙鈺瑩發表於2018-07-03

【本文轉載自微信公眾號:資料科學家養成記,作者:louwill,轉載授權請聯絡原作者】
目前小編的Python學習是按照兩個路徑在一路往下推,希望藉此改變過去大半年的Python一直在入門的狀態。一個路徑就是從純程式語言的角度來學習Python的,包括Python程式設計基礎、編寫函式、Python高階特性、函數語言程式設計、物件導向程式設計、多程式和多執行緒、常用內建模組和第三方庫等等,旨在學習和鍛鍊程式設計思維,提高小編自身的coding能力。另一個路徑是按照資料科學的角度來學習Python,這條路徑是想將R語言的資料處理和分析能力搬到Python上,主要是學習一些可用於資料分析的Python庫,包括NumPy、Pandas、SciPy、Matplotlib、Seaborn和scikit-learn等等。
第一個路徑學習所使用的資料是廖雪峰老師Python3教程 廖雪峰Python3教程 。
第二個路徑的學習資料主要來自Python的幫助文件和Wes McKinney的Python for Data Analysis 一書。各位看官可自行去網上尋找一下這本Python資料分析入門書籍。 先簡單介紹了下小編學習Python主要方法和參考資料,很明顯今天的主題numpy是屬於第二個路徑的內容,下面就開始進入今天的正題。
NumPy簡介
NumPy是Python中科學計算庫,其主要物件是包含同種元素的多維陣列。在NumPy中陣列的維度也叫做軸(axis),軸的個數叫做秩(rank)。小編在這裡有必要跟大家提醒一下,線性代數真的是一門很重要的數學基礎課程,認真學好並精通真的是太重要了。
本文小編主要從如何利用numpy建立一個陣列物件、列印陣列、numpy物件的基本運算和線性代數運算、陣列的索引與切片、變換陣列形狀等方面來介紹numpy。
建立一個numpy物件
利用numpy建立陣列物件方法很多,但最常用的還是 array方法和 arange方法。 先看利用 arange方法建立的陣列物件:

  1. #arange方法建立一個陣列

  2. import numpy as np

  3. a = np.arange(15).reshape(3,5)

  4. a

  5. array([[ 0, 1, 2, 3, 4],

  6.        [ 5, 6, 7, 8, 9],

  7.        [10, 11, 12, 13, 14]])

  8. #arange()建立陣列的另一種方式

  9. np.arange(10,30,5)

  10. array([10, 15, 20, 25])

再看array方法:

  1. #array方法建立一個陣列

  2. b = np.array([6,7,8])

  3. b

  4. array([6, 7, 8])
對建立後的陣列物件可以檢視一些屬性:

  1. #檢視陣列維度
  2. a.shape

  3. (3, 5)

  4. #檢視陣列軸的個數

  5. a.ndim

  6. 2
  7. #檢視陣列物件元素型別
  8. a.dtype

  9. dtype('int32')

  10. #檢視物件型別

  11. type(a)

  12. numpy.ndarray

  13. type(b)

  14. numpy.ndarray

可以看到numpy陣列類為ndarray。 我們也可以在建立陣列的時候就指定元素型別:

  1. #在陣列建立時就指定dtype

  2. c = np.array([[1,2],[3,4]], dtype = complex)

  3. c

  4. array([[ 1.+0.j,2.+0.j],

  5.       [ 3.+0.j,4.+0.j]])

還可以利用一些基礎函式來建立陣列:

  1. #建立全零矩陣

  2. np.zeros((3,4))

  3. array([[ 0.,0.,0.,0.],

  4.        [ 0.,0.,0. 0.],

  5.        [ 0.,0.,0.,0.]])

  6. #建立全一矩陣

  7. np.ones((3,4))

  8. array([[ 1.,1.,1.,1.],

  9.        [ 1.,1.,1.,1.],

  10.        [ 1.,1.,1.,1.]])

列印陣列
從上面的演示大家應該也可以看到,在Python中直接輸入陣列物件後返回的是一個帶有array字樣的物件,但使用 print函式對陣列物件進行列印顯示的結果就不會有這個字樣了:

  1. #一維陣列列印成行

  2. x = np.arange(5)

  3. print
  4. (x)

  5. [0 1 2 3 4]

  6. #二維陣列列印成矩陣

  7. y = np.arange(10).reshape(2,5)

  8. print
  9. (y)

  10. [[0 1 2 3 4]

  11.  [5 6 7 8 9]]

  12. #三維陣列列印成矩陣列表

  13. z = np.arange(24).reshape(2,3,4)

  14. print
  15. (z)

  16. [[[ 0 1 2 3]

  17.   [ 4 5 6 7]

  18.   [ 8 9 10 11]]


  19.  [[12 13 14 15]

  20.   [16 17 18 19]
  21.   [20 21 22 23]]]

陣列的基本運算
既然numpy是科學計算庫,它的進行一些計算也是非常強大的:

  1. #numpy陣列物件是按照對應進行運算的

  2. a = np.array([10,20,30,40])

  3. b = np.arange(10,30,5)

  4. c = a - b

  5. c

  6. array([ 0,5,10,15])


  7. b **
  8. 2

  9. array([100,225,400,625], dtype=int32)


  10. a < 35

  11. array([ True,True,True,False], dtype=bool)

  12. #numpy中*按元素進行運算,矩陣乘法使用dot函式

  13. a = np.array([[1,1],[0,1]])

  14. b = np.array([[2,0],[3,4]])

  15. a * b

  16. array([[2,0],

  17.        [0 4]])

  18. np.dot(a,b)

  19. array([[5,4],

  20.        [3,4]])

可見,Python矩陣的計算採用的是點乘的方式,跟matlab較為相似。 除了直接的四則運算,還可以複雜一點:

  1. #*=/+=等符號用來更改已存在的陣列而不是建立一個新的陣列

  2. a *= 3

  3. a

  4. array([[3,3],

  5.        [0,3]])

  6. b += a
  7. #b=b+a

  8. b

  9. array([[ 8,6],

  10.        [ 3,10]])

  11. #axis引數對陣列指定軸進行運算

  12. c = np.arange(12).reshape(3,4)

  13. c

  14. array([12,15,18,21])

  15. #對陣列每行取最小值

  16. c.min(axis = 1)

  17. array([[ 0,1,2,3],

  18.        [ 4,5,6,7],
  19.        [8,9,10,11]])

  20. #對陣列每列進行求和計算

  21. c.sum(axis = 0)

  22. array([12,15,18,21])

  23. #numpy也提供一些通用的數學計算函式

  24. b = np.arange(5)

  25. np.exp(b)

  26. array([ 1.        , 2.71828183,7.3890561 ,20.08553692,54.59815003])

  27. np.sqrt(b)

  28. array([ 1.        ,2.71828183,7.3890561 ,20.08553692,54.59815003])

利用numpy進行線性代數運算也是非常方便的:

  1. import
  2.  numpy
  3. as
  4.  np

  5. from
  6.  numpy.linalg
  7. import
  8.  *

  9. a = np.array([[1,2],[3,4]])

  10. print
  11. (a)

  12. [[1 2]

  13.  [3 4]]

  14. #求轉置

  15. a.transpose()

  16. array([[1,3],

  17.        [2,4]])

  18. #求逆

  19. inv(a)

  20. array([[-2. ,1. ],

  21.        [ 1.5, -0.5]])

  22. #生成單位陣

  23. np.eye(3)

  24. array([[ 1.,0.,0.],

  25.        [ 0.,1.,0.],

  26.        [ 0.,0.,1.]])

  27. #求跡

  28. np.trace(a)

  29. 5

  30. #求解矩陣方程

  31. y = np.array([[5],[7]])

  32. solve(a,y)

  33. array([[-3.],

  34.        [ 4.]])

關於numpy的簡單運算小編就例舉這麼多,細加探索numpy遠比你想象的要強大。
陣列物件的索引與切片
關於切片的知識,小編在之前的Python學習的第一條路徑中就已介紹過了,主要是針對list和tuple物件,將索引和切片應用在陣列上也是非常方便的。

  1. a = np.arange(10)**2
  2. a

  3. array([ 0,1,4,9,16,25,36,49,64,81], dtype=int32)

  4. #訪問一個數

  5. a[3]

  6. 9

  7. #訪問一串數

  8. a[2:5]

  9. array([ 4,9,16], dtype=int32)

  10. #按索引替換元素

  11. a[:6:2] =2017

  12. a

  13. array([2017,1,2017,9,2017,25,36,49,64,81], dtype=int32)

  14. #給陣列反向呈現

  15. a[::-1]

  16. array([ 81,64,49,36,25,2017,9,2017,1,2017], dtype=int32)

  17. #多維陣列對每個軸都可以進行索引

  18. def
  19.  f(x,y):

  20.     
  21. return
  22.  x*3+2*y

  23. b = np.fromfunction(f,(5,4),dtype = int)

  24. b

  25. array([[ 0,2,4,6],

  26.        [ 3,5,7,9],

  27.        [ 6,8,10,12],

  28.        [ 9,11,13,15],

  29.        [12,14,16,18]])

  30. b[2,3]

  31. 12

  32. b[0:5,1]

  33. array([ 2,5,8,11,14])

  34. #當少於軸數的索引被提供時,則被預設為取整個切片

  35. b[-1]

  36. array([12,14,16,18])

更改陣列形狀

最後一個需要給大家介紹的是對陣列形狀進行更改:

  1. a = np.arange(10,110,10).reshape(2,5)

  2. a

  3. array([[ 10,20,30,40,50],

  4.        [ 60,70,80,90,100]])

  5. a.shape

  6. (2,5)

  7. #展開陣列

  8. a.ravel()

  9. array([ 10,20,30,40,50,60,70,80,90,100])

  10. #reshape函式僅改變引數形狀,而resize函式則改變陣列本身

  11. a.resize(5,2)

  12. a

  13. array([[ 10,20],

  14.        [ 30,40],

  15.        [ 50,60],

  16.        [ 70,80],

  17.        [ 90,100]])

可見reshape方法與resize方法還是有著本質的區別。
numpy總結
1.建立陣列 arange, array, copy, empty, emptylike, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, oneslike, r , zeros, zeros_like 
2.轉化 astype, atleast 1d, atleast 2d, atleast 3d, mat 
3.操作 array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack 
4.詢問 all, any, nonzero, where 
5.排序 argmax, argmin, argsort, max, min, ptp, searchsorted, sort 
6.運算 choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum 
7.基礎統計和線性代數 cov, mean, std, var, cross, dot, outer, svd, vdot, eye, transpose, inv, trace
參考資料:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2157270/,如需轉載,請註明出處,否則將追究法律責任。

相關文章