1. 程式人生 > 其它 >人工智慧機器學習有關-Numpay(三)

人工智慧機器學習有關-Numpay(三)

人工智慧機器學習有關-Numpay(三)

1、Numpy介紹

  • 定義:

    • Numpy是一個開源的Python科學計算庫,用於快速處理任意維度的陣列。
    • Numpy中,儲存物件是ndarray。
  • 建立Numpy:

    import numpy as np
    np.array([])
    
  • numpy優勢

    • 記憶體塊風格--一體式儲存
    • 支援並行化運算
    • 效率高於純python程式碼---底層使用了c,內部釋放了GIL

2、N維陣列

  • ndarray的屬性

    • ndarray.shape:陣列維度的元組
    • ndarray.ndim:陣列維度
    • ndarray.size:陣列中的元素數量
    • ndarray.itemsize:一個數組元素的長度
    • ndarray.dtype:陣列元素的型別
  • ndarray的形狀

    ​ np.array()

    ​ 三維陣列不好理解---excel中有多個sheet

  • ndarray的型別

    ​ bool

    ​ int

    ​ float

    ​ str.....

    ​ 注意:如果不指定,正說預設為int64,小數預設為float64。

3、Numpy的基本操作

  • 生成陣列的方法

    • 生成0和1陣列

      • np.ones()
      • np.ones_like()
    • 從現有陣列中生成

      • np.array---深拷貝
      • np.asarray--淺拷貝
    • 生成等間隔陣列

      • np.linspace(1,100,11) #從1到100,間隔是11;效果如下:

        array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])
        
      • np.arange(10,50,2) #從10到50,間隔是2;效果如下:

        array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
               44, 46, 48])
        
      • np.logspace(1,3,1) #生成以10的N次冪的資料;效果如下:

        array([  10.,  100., 1000.])
        
    • 生成隨機陣列

      使用np.random

      • 均勻分佈

        • np.random.rand(2,3) #隨機生成兩行三列的陣列,效果如下:
        array([[0.35756598, 0.57026639, 0.02924949],
               [0.02111498, 0.72537111, 0.94669752]])
        
        • np.random.uniform(low=1,high=10,size=([3,5]))#下限是1,上限是10,生成三行五列;效果如下

          array([[3.15528825, 1.01357735, 4.72909696, 8.01292636, 4.8997339 ],
                 [5.65180884, 4.07661969, 9.52166085, 4.26229383, 3.72778983],
                 [8.32872314, 3.17203041, 2.16791937, 3.95843925, 8.59350188]])
          
      • 正態分佈

        • 均值:圖形的左右位置

        • 方差:影象是瘦還是胖

          ​ 值越小,圖形越瘦高,資料越集中

          ​ 值越大,圖形越矮胖,資料越分散

    • 正態分佈建立方式

      • np.random.randn(d0,d1,d2.....)
      • np.random.normal(loc=0.0,scale=1.0,size=None);loc代表比概率分佈的均值;scale代表次概率分佈的標準差;size表示輸出的shape,預設為None,只輸出一個值。
      • np.random.standard_normal(size=None):返回指定形狀的標準正態分佈的陣列

4、陣列索引,切片

先對行進行索引,在進行列索引

高維陣列索引,從巨集觀到微觀

  • 程式碼如下

    stock_change = np.random.normal(0,1,(8,10))
    array([[-1.44426604, -0.35956676,  0.10022073, -0.37589995,  0.41068841,
             0.35831041, -2.18716918, -0.27044373, -0.60649162,  0.74780256],
           [ 1.50355343,  0.00727481,  0.70220799,  0.11446953,  2.29954941,
            -0.06165946,  0.43377417,  2.66687501,  1.31977339,  0.39484888],
           [ 0.57895097,  0.75483241,  0.46582577, -1.70723503, -0.4722333 ,
             1.36472691,  0.31702275,  0.95247131,  1.13712267, -0.92562661],
           [ 0.42483005, -0.52735992, -1.22389302, -0.70718243, -0.74624277,
            -0.46608281,  2.3002048 ,  0.55910289,  1.27616921, -0.22121508],
           [-0.07102279,  0.23494155,  0.35115159,  0.22186354,  0.85730874,
             0.86016689,  0.42037822, -0.36173826, -1.26004742,  0.22148513],
           [-1.00150606,  0.32304105, -0.64324946, -0.15920028, -0.12329149,
            -0.91909789, -0.70919568,  0.76674683, -1.23383876,  1.57300598],
           [-0.40099816, -0.9621985 , -0.55014995,  0.0815694 ,  1.16744742,
            -0.15184784,  0.08657591, -1.00556795,  0.06046253,  0.1674691 ],
           [ 0.55177698, -1.4687088 , -2.43569035,  1.31883436, -1.06246593,
             0.44006957, -0.8233832 , -1.01700783, -0.98957025,  1.10041451]])
    
    #進行切片
    stock_change[0:2, 0:3]  #從0到2兩行,從0到3三列
    array([[-1.44426604, -0.35956676,  0.10022073],
           [ 1.50355343,  0.00727481,  0.70220799]])
    

5、形狀修改

stock_change = np.random.normal(0,1,(4,5))
stock_change
array([[-1.13690825, -0.86626341,  0.26315935, -1.50416658, -0.20551933],
       [-0.62318598,  0.45052168, -1.31538088, -1.05299411,  0.98931701],
       [-0.90524912, -1.27093755,  0.7382356 ,  0.94703348, -0.05833449],
       [-2.33703858,  0.05670275,  1.97424882,  0.09213721,  0.26717848]])   
  • 物件.reshape:不進行行列互換,產生新變數

    stock_change.resize([5,4])
    array([[-0.56597865,  1.37304626,  0.88760232,  1.60456417],
           [ 0.42406144,  0.85342625,  0.17185211,  0.63999772],
           [ 0.63243256, -0.14288988,  0.51224131,  0.52807762],
           [-0.25435597,  1.08117107, -1.27219027, -0.96426461],
           [ 0.47159064,  1.19946091,  0.10747391, -0.34872273]])
    
  • 物件.resize:進行行列互換,對原來的值進行修改

    stock_change.resize([5,4])#不直接輸出結果,改變原來陣列的值
    stock_change
    array([[-0.56597865,  1.37304626,  0.88760232,  1.60456417],
           [ 0.42406144,  0.85342625,  0.17185211,  0.63999772],
           [ 0.63243256, -0.14288988,  0.51224131,  0.52807762],
           [-0.25435597,  1.08117107, -1.27219027, -0.96426461],
           [ 0.47159064,  1.19946091,  0.10747391, -0.34872273]])
    
  • 物件.T:進行行列互換

    stock_change.T
    array([[-1.13690825, -0.62318598, -0.90524912, -2.33703858],
           [-0.86626341,  0.45052168, -1.27093755,  0.05670275],
           [ 0.26315935, -1.31538088,  0.7382356 ,  1.97424882],
           [-1.50416658, -1.05299411,  0.94703348,  0.09213721],
           [-0.20551933,  0.98931701, -0.05833449,  0.26717848]])   
    

6、型別修改

  • 物件.astype(np.int32)#括號裡面是你要修改成的資料型別。例如:

    stock_change
    array([[ 0.70391962, -0.64805071,  1.86832388, -0.99192503, -0.84167201],
           [-1.05297977,  0.29382444, -1.7573821 ,  1.22405082,  1.05422963],
           [ 0.18694931, -0.54332531, -0.48083977,  0.73456394,  0.03539551],
           [ 1.98783588,  0.43443585,  0.61193212, -0.31977936, -1.12256928]])
           
    stock_change.astype(np.int32)
    array([[ 0,  0,  1,  0,  0],
           [-1,  0, -1,  1,  1],
           [ 0,  0,  0,  0,  0],
           [ 1,  0,  0,  0, -1]])
    
  • 物件.tostring()

    arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    arr.tostring()
    b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00'
    

7、陣列的去重

arr= np.array([[1,2,3,4,5,6],[4,5,6,7,8,9]])
arr
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])


np.unique(arr)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

8、ndarray運算

import numpy as np
stock_change = np.random.normal(0,1,(8,10))
stock_change
array([[ 0.04799655,  0.65765235,  0.42361094,  0.81425383, -0.14889895,
         0.34435302, -0.89120847,  1.09553709, -0.39220518,  0.35681464],
       [-0.1205083 ,  1.04201374, -0.84020323, -0.76451012,  0.38678516,
        -0.48928631, -0.03033363, -0.64034053, -0.31345406,  1.00351474],
       [-1.18944149, -1.21265991, -0.27092964,  0.78723819,  0.86631678,
        -0.41733842, -0.17263459,  0.57000637, -0.90242552,  1.1615763 ],
       [ 0.20939948,  1.0627663 , -1.11295892, -2.20829153, -0.13560078,
         0.04241456,  1.95342178, -1.52867478, -0.4256004 ,  1.89226058],
       [-1.14428267, -1.03230368, -0.64917991,  0.95959798, -0.1140127 ,
        -0.60413769,  0.64979583,  1.96630929, -1.50833397, -0.18793   ],
       [-0.16371276, -0.07527353, -1.07491874, -0.460191  , -0.82218305,
         1.35116945,  0.0615233 , -1.2129384 , -1.21896538,  0.19445662],
       [-2.24073749, -0.4371897 , -0.65786767, -1.20137206, -0.74103418,
         0.03041893,  1.92970227, -1.74572423,  0.04164877,  1.58580713],
       [ 0.04217637, -0.62788208,  0.15461643, -0.38924692, -0.71137869,
         1.86107771,  0.63093733,  0.03397154, -0.02377345,  0.15119872]])
         
stock_c = stock_change[0:5,0:5]
stock_c
array([[ 0.04799655,  0.65765235,  0.42361094,  0.81425383, -0.14889895],
       [-0.1205083 ,  1.04201374, -0.84020323, -0.76451012,  0.38678516],
       [-1.18944149, -1.21265991, -0.27092964,  0.78723819,  0.86631678],
       [ 0.20939948,  1.0627663 , -1.11295892, -2.20829153, -0.13560078],
       [-1.14428267, -1.03230368, -0.64917991,  0.95959798, -0.1140127 ]])
  • 邏輯運算

    stock_c>1  
    array([[False, False, False, False, False],
           [False,  True, False, False, False],
           [False, False, False, False, False],
           [False,  True, False, False, False],
           [False, False, False, False, False]])
           
    stock_c[stock_c>1] = 2
    stock_c
    array([[ 0.04799655,  0.65765235,  0.42361094,  0.81425383, -0.14889895],
           [-0.1205083 ,  2.        , -0.84020323, -0.76451012,  0.38678516],
           [-1.18944149, -1.21265991, -0.27092964,  0.78723819,  0.86631678],
           [ 0.20939948,  2.        , -1.11295892, -2.20829153, -0.13560078],
    
  • 通用判斷函式

    • np.all():滿足所有的要求才返回true

      stock_d = stock_change[0:2,0:5]
      stock_d
      array([[ 0.04799655,  0.65765235,  0.42361094,  0.81425383, -0.14889895],
             [-0.1205083 ,  2.        , -0.84020323, -0.76451012,  0.38678516]])
      
      np.all(stock_d>0)  #全部大於0才返回true
      False
      
    • np.any():有一個滿足要求就返回true

      np.any(stock_d>0) #有一個大於0就返回true
      True
      
  • 三元運算子

    • np.where()
    np.where(stock_d>0,1,0)   #在stock_d中大於0的賦值為1,小於0的賦值為0
    array([[1, 1, 1, 1, 0],
           [0, 1, 0, 0, 1]])
    
    • np.logic_and():並的意思
    • np.logic_or:或的意思
  • 統計運算

    • min:求最小值
    • max:求最大值
    • midian:求中位數
    • mean:均值
    • std:標準差
    • var:方差
    • argmax:最大值下標
    • argmin:最小值下標

9、矩陣乘法

  • np.matmul():矩陣相乘,不支援矩陣與數字相乘

    a = np.array([[80, 86],
    [82, 80],
    [85, 78],
    [90, 90],
    [86, 82],
    [82, 90],
    [78, 80],
    [92, 94]])
    
    b = np.array([[0.7], [0.3]])
    np.matmul(a,b)
    array([[81.8],
           [81.4],
           [82.9],
           [90. ],
           [84.8],
           [84.4],
           [78.6],
           [92.6]])
    
  • np.dot():點乘,支援矩陣與數字相乘

    np.dot(a,10)
    array([[81.8],
           [81.4],
           [82.9],
           [90. ],
           [84.8],
           [84.4],
           [78.6],
           [92.6]])
    

    兩者在進行矩陣相乘的時候沒有區別