NumPy基礎操作(3)——代數運算和隨機數

NumPy基礎操作(3)——代數運算和隨機數

(注:記得在文件開頭導入import numpy as np) 

目錄:

  • NumPy在矩陣運算中的應用
    • 常用矩陣運算函數介紹
    • 編程實現
  • 利用NumPy生成隨機數以及隨機漫步
    • 常用隨機數生成函數介紹
    • 編程實現
    • 隨機漫步編程實現  

 

NumPy在矩陣運算中的應用

  • 常用矩陣運算函數介紹

常用的numpy函數

diag 將一維數組轉換為方陣,一維數組元素為方陣對角線元素
dot 矩陣點乘運算
trace 計算對角線元素的和
det 計算矩陣的行列式
eig 計算方陣的特徵值和對應的特徵向量
inv 計算方陣的逆
solve 求解線性方程組Ax=b,其中A為方陣
lstsq 計算Ax=b的最小二乘解

 

  • 編程實現

     1 x = np.ones(3)
     2 xmat = np.diag(x)
     3 print(xmat)
     4 
     5 #輸出結果
     6 '''
     7 [[1. 0. 0.]
     8  [0. 1. 0.]
     9  [0. 0. 1.]]
    10 '''
    1 x = np.ones(3)
    2 xmat = np.diag(x)
    3 N = np.trace(xmat)
    4 print(N)
    5 
    6 #輸出結果
    7 '''
    8 3.0
    9 '''
     1 x = np.ones(3)
     2 xmat = np.diag(x)
     3 [s, p] = np.linalg.eig(xmat)   #返回xmat矩陣的特徵值和特徵向量
     4 #注意這裏不能直接用np.eig(),應該加上np.linalg.eig()
     5 print(s)
     6 print("************")
     7 print(p)
     8 
     9 #輸出結果
    10 '''
    11 [1. 1. 1.]
    12 ************
    13 [[1. 0. 0.]
    14  [0. 1. 0.]
    15  [0. 0. 1.]]
    16 '''
     1 xarr = np.array([[1, 2], [3, 4]])
     2 yarr = np.array([[5, 6], [7, 8]])
     3 print(xarr)
     4 print(yarr)
     5 print("************")
     6 x_mul_y = np.dot(xarr, yarr)        #.dot()是矩陣的乘法
     7 x_dot_y = xarr*yarr                 #*號乘法是矩陣元素對應相乘
     8 print(x_dot_y)
     9 print(x_mul_y)
    10 
    11 #輸出結果
    12 '''
    13 [[1 2]
    14  [3 4]]
    15 [[5 6]
    16  [7 8]]
    17 ************
    18 [[ 5 12]
    19  [21 32]]
    20 [[19 22]
    21  [43 50]]
    22 '''
 1 xarr = np.array([[1, 2], [3, 4]])
 2 yarr = np.array([[5, 6], [7, 8]])
 3 
 4 print(xarr)
 5 print(yarr)
 6 print("************")
 7 x = np.linalg.solve(xarr, yarr)     #求解xarr.dot(x) = yarr
 8 print(x)
 9 #輸出結果
10 '''
11 [[1 2]
12  [3 4]]
13 [[5 6]
14  [7 8]]
15 ************
16 [[-3. -4.]
17  [ 4.  5.]]
18 '''

 

 1 x = np.array([0, 1, 2, 3])
 2 y = np.array([-1, 0.2, 0.9, 2.1])
 3 A = np.vstack([x, np.ones(len(x))]).T
  A=

[[0. 1.]
[1. 1.]
[2. 1.]
[3. 1.]]

 4 m, c = np.linalg.lstsq(A, y)[0]         #擬合y = mA+c 一次曲線
 5 
 6 
 7 print(m, c)
 8 import matplotlib.pyplot as plt
 9 plt.plot(x, y, 'o', label='Original data', markersize=10)
10 plt.plot(x, m*x + c, 'r', label='Fitted line')
11 plt.legend()
12 plt.show()
13 #輸出結果
14 '''
15 0.9999999999999999 -0.9499999999999997
16 '''

輸出擬合曲線為:
《NumPy基礎操作(3)——代數運算和隨機數》

 

 

利用NumPy生成隨機數以及隨機漫步

  • 常用隨機數生成函數介紹

    部分numpy.random函數

    seed 確定隨機數生成器的種子
    permutation 返回一個序列的隨機排列或返回一個隨機排列的範圍
    shuffle 對一個序列隨機排列
    rand 產生均勻分佈的樣本值
    randint 從給定的上下限範圍內隨機選取整數
    randn 產生正態分佈(平均值為0,標準差為1)的樣本值
    binomial 產生二項分佈的樣本值
    normal 產生正太(高斯)分佈的樣本值
    uniform 產生在[0,1)中均勻分佈的樣本值

 

  • 編程實現

     1 x = np.arange(10)
     2 print(x)
     3 print("************")
     4 np.random.shuffle(x)        #這裏直接打亂原始序列,不會返回任何值,再次輸出原序列即可看到改變
     5 print(x)
     6 
     7 np.random.seed(666)         #設置一個隨機數種子,相同的隨機數種子產生的隨機數相同
     8 y_1 = np.random.randint(0, 10, size=10)
     9 y_2 = np.random.randint(0, 10, size=10)
    10 np.random.seed(666)         #設置一個隨機數種子,相同的隨機數種子產生的隨機數相同
    11 y_1_seed = np.random.randint(0, 10, size=10)
    12 print("************")
    13 print(y_1, y_2, y_1_seed)
    14 #輸出結果
    15 '''
    16 [0 1 2 3 4 5 6 7 8 9]
    17 ************
    18 [8 3 9 7 6 5 2 4 0 1]
    19 ************
    20 [2 6 9 4 3 1 0 8 7 5] [2 5 5 4 8 4 4 0 0 4] [2 6 9 4 3 1 0 8 7 5]
    21 '''
     1 #permutation()給出序列隨機排序的結果
     2 x = np.random.permutation([1, 2, 3])    #不是就地打亂,可以進行賦值
     3 print(np.random.permutation([1]))
     4 print(np.random.permutation([1, 2]))
     5 print(x)
     6 #輸出結果
     7 '''
     8 [1]
     9 [2 1]
    10 [3 2 1]
    11 '''

     

     

  • 實例:隨機漫步

     1 import matplotlib.pyplot as plt
     2 
     3 nsteps = 1000
     4 draws = np.random.randint(0, 2, size=nsteps)
     5 steps = np.where(draws > 0, 1, -1)
     6 walk = steps.cumsum()
     7 print(walk.min(), walk.max())
     8 print((np.abs(walk) >= 10).argmax())        #argmax()返回數組中第一個最大值的索引號
     9 #(np.abs(walk) >= 10)已經變成了布爾型數組
    10 
    11 #繪製前100次的隨機漫步結果
    12 plt.plot([x for x in range(100)], walk[:100])
    13 plt.title("Random walk with +1/-1 steps")
    14 plt.show()
    15 #輸出結果
    16 '''
    17 -10 31
    18 51
    19 '''

     

     《NumPy基礎操作(3)——代數運算和隨機數》

 

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *