Python數據分析-Numpy

Numpy特點

——如果有想關注Java開發相關的內容,可以轉Java修煉之道
詳細觀看——

Numpy作爲使用Python進行科學計算的常用庫,有着如下特點:

  • 提供了N維數組(矩陣),快速高效,矢量數學運算;
  • 高效的Index,不需要循環,因爲底層實現採用了C語言開發。

常見的數組和矩陣的方法

數組和矩陣的創建與維度信息
  • numpy.array()

    ## 數組的創建
    vector = numpy.array([1,2,3,4])
    
    ## 矩陣的創建
    matrix = numpy.array([
        [1,2,3],
        [4,5,6],
        [7,8,9]
    ])
    
  • shape

    ## 打印數組的維度信息
    vector.shape() ——》(4,) # 數組中存在4個元素
    
    ## 打印矩陣的維度信息
    matrix.shape()——》(3,3) #三行三列
    
  • reshape

    eg:
    a = np.arange(15).reshape(3, 5) #隨機創建3行5列的矩陣
    Out:
       [[ 0  1  2  3  4]
       [ 5  6  7  8  9]
       [10 11 12 13 14]]
    a.ndim # 返回其維數 即 2
    

    注意:

    • reshape可以創建一個改變了尺寸的新數組,但是原始數組的shape是不會發生變化的。

    • reshape(-1):數組新的shape屬性應該要與原來的配套,如果等於-1的話,那麼Numpy會根據剩下的維度計算出數組的另外一個shape屬性值。

      eg:
      z = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8],
                [9, 10, 11, 12],
                [13, 14, 15, 16]])
      z.shape
        Out:(4, 4)
      z.reshape(-1)
        Out:array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])
      
    • reshape(-1,1):在不知道有多少行的情況下,轉變成一列數據

      eg:
      z.reshape(-1,1)
      Out:array([[ 1],
              [ 2],
              [ 3],
              [ 4],
              [ 5],
              [ 6],
              [ 7],
              [ 8],
              [ 9],
              [10],
              [11],
              [12],
              [13],
              [14],
              [15],
              [16]])
      
      
    • reshape(-1,2):在不知道有多少行的情況下,轉變成2列數據

      eg:
      z.reshape(-1, 2)
      Out:array([[ 1,  2],
              [ 3,  4],
              [ 5,  6],
              [ 7,  8],
              [ 9, 10],
              [11, 12],
              [13, 14],
              [15, 16]])
      
  • linspace

    • 一般情況下,先創建python序列,通過array函數轉換城數組,這樣的效率不高,但是可以直接通過arange函數,指定開始值、終值和步長來創建一維數組(數組不包括終止值)。

    • linspace函數通過指定開始值、終值和元素的個數來創建一維數組。但是可以通過endpoint關鍵字來指定是否包括終值,缺省值默認爲包括終止值。

      eg:
      np.linspace(0, 1, 10) # 步長爲1/9
      Out:——》array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
      
      
      
  • logspace

    logspace函數和linspace類似,不過它創建等比數列

    eg:
    np.logspace(0, 2, 20) # 產生1(10^0)到100(10^2)、有20個元素的等比數列
    
    array([ 1. ,    1.27427499,   1.62377674,    2.06913808,
    2.6366509 ,   3.35981829,   4.2813324 ,    5.45559478,
    6.95192796,  8.8586679 ,    11.28837892, 14.38449888,
    18.32980711, 23.35721469, 29.76351442, 37.92690191,
    48.32930239, 61.58482111, 78.47599704, 100. ])
    
  • **zeros()、ones()、empty()**可以創建指定形狀和類型的數組

    zeros_like()、ones_like()、empty_like()等函數可創建與參數數組的形狀及類型相同的數組。因此,“zeros_like(a)”和“zeros(a.shape,
    a.dtype)”的效果相同

    1.zeros(,dtype) == zeros_like() ——零矩陣
    eg:
    np.zeros(4, np.float) #元素類型默認爲np.float,因此這裏可以省略
    array([ 0., 0., 0., 0.])
    
    2.ones()——元素全部爲1的矩陣
    eg:
    numpy.ones((3,4),numpy.int) # 3行4列,元素類型爲int且全部爲1的矩陣
    array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [1, 1, 1, 1]])
           
    3.empty()——空矩陣
    eg:
    np.empty((2,3),np.int) #只分配內存,不對其進行初始化
    array([[ 32571594, 32635312, 505219724],
              [ 45001384, 1852386928, 665972]])
    
    
訪問和獲取元素
  • 切片(按照行列獲取)
    注意:切片操作的時候,表示的是一個從第一個想要索引開始到第i個你不想要的索引結束,其中第三個參數表示的是截取的步長

    ## 數組獲取元素
    vector[0:3]  #表示的是從第一個元素開始截取,獲取三個元素,返回[1,2,3]
    
    ## 矩陣獲取元素
    matrix[1:,0:2] # 從二列開始,獲取第一列和第二列,返回([
        [4,5],
        [7,8]
    ])
    
  • 按照條件獲取

    eg:
    a = vector[vector > 3] # 截取數組中所有元素大於3的,返回[4]
    a = vector[vector == 4] # 截取數組中元素等於4的數組,如果不存在的話,返回一個空數組
    
    b = matrix[matrix > 5] # 截取矩陣中所有元素大於5,返回結果是一個一維數組,即[6,7,8,9]
    b = matrix[matrix == 9] # 返回的是一個boolean矩陣,結果[
        [False,False,False],
        [False,False,False],
        [Fasle,False,True]
    ]
    
    • 混淆項

      1. 數組比較和按照條件截取數組內容的返回結果是不相同的
      eg:
      print(vector == 3) # 返回的是將數組的元素逐一比較,返回的是一個boolean數組
      
      print(vector[vector==3]) # 返回的是截取數組中滿足條件的數組
      
      2. 矩陣比較和按照條件截取矩陣內容的返回結果是不相同的
      eg:
      print(matrix == 3) # 返回的是將矩陣的元素逐一比較,返回的是一個boolean矩陣
      
      print(matrix[matrix==3]) # 返回的是截取矩陣中滿足條件的數組
      
      
  • 按照整數序列存取元素

    當使用整數序列對數組元素進行存取時,將使用整數序列中的每個元素作爲下標,整數序列可以是列表或者數組。使用整數序列作爲下標獲得的數組不和原始數組共享數據空間。也就是說,獲取的新數組如果發生改變,原數組是不會發生改變的。相對前兩者而言,這種存取方式是高效的。

    eg:
    a = numpy.linspace(0,1,10,endpoint=False)
    a
    >> array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
    
    # 按照整數序列,選取第4個、第6個、第8個、第10個元素進行組成新的數組
    b = a[[3,5,7,9]]
    b
    >> array([0.3, 0.5, 0.7, 0.9])
    
    # 按照序列修改對應位置的值
    b[[0,1,2]]= -1,-2,-3
    b
    >> array([-1. , -2. , -3. ,  0.9])
    
  • 使用布爾數組

    當使用布爾數組b作爲下標存取數組x中的元素時,將收集數組x中所有在數組b中對應下標爲True的元素。使用布爾數組作爲下標獲得的數組不和原始數組共享數據空間,注意這種方式只對應於布爾數組,不能使用布爾列表。

  • 注意:

    • 和Python的列表序列不同,通過下標範圍獲取的新的數組是原始數組的一個視圖。它與原始數組共享同一塊數據空間,也就是說,新數組元素髮生變化,原數組也會同時發生變化的
常見的運算
  • sum

    eg:
     # 數組求和
     
     # 矩陣求和
     # The axis dictates which dimension we perform the operation on
     #1 means that we want to perform the operation on each row, and 0 means on each column
     matrix = numpy.array([
                     [5, 10, 15], 
                     [20, 25, 30],
                     [35, 40, 45]
                  ])
     matrix.sum(axis=1) # axis=1表示按照每一行進行求和,axis=0表示按照每一列進行求和
    
  • 乘積

    eg:
    #The matrix product can be performed using the dot function or method
    A = numpy.array([
        [1,2],
        [3,4]
    ])
    B = numpy.array([
        [1,1],
        [4,6]
    ])
    
    # 普通的乘積
    multi = A * B
    print(multi)
    》》[[ 1  2]
        [12 24]]
    
    ## 點積運算
    resultdot = numpy.dot(A,B)
    print(resultdot)
    》》[[ 9 13]
        [19 27]]
    
    # flatten the array 鋪平
    print(A.ravel())
    》》[1 2 3 4]
    
    # 橫向拼接/縱向拼接
    print(numpy.vstack((A,B)))/numpy.hstack((A,B))
    》》[[1 2]
        [3 4]
        [1 1]
        [4 6]]
    
    
  • 均值、方差

    • **mean()**用於求數組的平均值,也可以通過axis參數指定求平均值的軸,通過out參數指定輸出數組。和sum()不同的是,對於整數數組,它使用雙精度浮點數進行計算,而對於其他類型的數組,則使用和數組元素類型相同的累加變量進行計算。

    • **average()**也可以對數組進行平均計算。它沒有out和dtype參數,但有一個指定每個元素權值的weights參數。

    • std()var()分別計算數組的標準差和方差,有axisout及dtype等參數。

      eg:
      f = numpy.array([[ 0,  1,  2,  3,  4,  5],
             [10, 11, 12, 13, 14, 15],
             [20, 21, 22, 23, 24, 25],
             [30, 31, 32, 33, 34, 35],
             [40, 41, 42, 43, 44, 45],
             [50, 51, 52, 53, 54, 55]])
       ## 均值
      f.mean(f,axis=1) #整數數組使用雙精度浮點數進行計算 
      >> array([ 2.5, 12.5, 22.5, 32.5, 42.5, 52.5])
      
      ## 方差
      numpy.var(f,axis=1)
      》》array([2.91666667, 2.91666667, 2.91666667, 2.91666667, 2.91666667,
             2.91666667])
      
      ## 標準差
      numpy.std(f,axis=1)
      》》array([1.70782513, 1.70782513, 1.70782513, 1.70782513, 1.70782513,
             1.70782513])
      
  • 三種轉置運算T、transpose、swapaxes

    • T是一種普通的轉置
    • transpose屬於一種軸變換
    • swapaxes其實就是把矩陣中某兩個軸對換一下,屬於軸對稱
    arr = numpy.arange(24).reshape((2, 3, 4))
    arr
    》》array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
    
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    ## 轉置       
    arr.T
    》》
    array([[[ 0, 12],
            [ 4, 16],
            [ 8, 20]],
    
           [[ 1, 13],
            [ 5, 17],
            [ 9, 21]],
    
           [[ 2, 14],
            [ 6, 18],
            [10, 22]],
    
           [[ 3, 15],
            [ 7, 19],
            [11, 23]]])
    
    ## 將軸1和軸0互換,軸2不變,原始是(0,1,2)
    arr.transpose(1,0,2)
    》》array([[[ 0,  1,  2,  3],
            [12, 13, 14, 15]],
    
           [[ 4,  5,  6,  7],
            [16, 17, 18, 19]],
    
           [[ 8,  9, 10, 11],
            [20, 21, 22, 23]]])
    
    ## 將軸1和軸0互換,原始是(0,1)
    arr.swapaxes(1, 0)
    》》array([[[ 0,  1,  2,  3],
            [12, 13, 14, 15]],
    
           [[ 4,  5,  6,  7],
            [16, 17, 18, 19]],
    
           [[ 8,  9, 10, 11],
            [20, 21, 22, 23]]])
    
  • 最值和排序

    • max()、min()求最大最小值

    • ptp()計算最大值和最小值之間的差

    • 用argmax()和argmin()可以求最大值和最小值的下標。如果不指定axis參數,就返回平坦化之後的數組下標

    • 數組的sort()方法用於對數組進行排序,它將改變數組的內容。而sort()函數則返回一個新數組,不改變原始數組。它們的axis參數默認值都爲-1,即沿着數組的最後一個軸進行排序。
      sort()函數的axis參數可以設置爲None,此時它將得到平坦化之後進行排序的新數組。

    • argsort()返冋數組的排序下標,axis參數的默認值爲-1

    • 用**median()**可以獲得數組的中值,即對數組進行排序之後,位於數組中間位置的值,當長度是偶數時,得到正中間兩個數的平均值。它也可以指定axis和out參數

    • eg:
      a2 = floor(10*random.random((2,2))) 
      >>> a2 
      array([[ 1., 1.],
             [ 5., 8.]])
      >>>np.min(a2) # 最小值
      1.0
      >>>np.max(a2) # 最大值
      9.0
      >>>np.ptp(a2) # 最大最小值的差值
      8.0
      >>> np.argmax(a) #找到數組a中最大值的下標,有多個最值時得到第一個最值的下標 
      2
      >>> idx = np.argmax(a, axis=1)
      >>> idx
      array([2, 3, 0, 0])
      ## 使用xrange()選擇出每行的最大值
      >>> a[xrange(a.shape[0]),idx]
      array([9, 8, 9, 9])
      
      >>> np.sort(a, axis=0) #對每列的數據進行排序 array([[5,1,1, 4, 0],
                [7, 1, 3, 6, 0],
                [9, 5, 9, 7, 2],
                [9, 8, 9'8, 3]])
      
  • 按照某個軸的方向進行復制——tile

    eg:
    a = numpy.arange(0, 40, 10)
    a
    》》array([ 0, 10, 20, 30])
    
    ## 將數組作爲元素複製成3行5列的矩陣
    b = numpy.tile(a, (3, 5)) 
    b
    》》array([[ 0, 10, 20, 30,  0, 10, 20, 30,  0, 10, 20, 30,  0, 10, 20, 30,
             0, 10, 20, 30],
           [ 0, 10, 20, 30,  0, 10, 20, 30,  0, 10, 20, 30,  0, 10, 20, 30,
             0, 10, 20, 30],
           [ 0, 10, 20, 30,  0, 10, 20, 30,  0, 10, 20, 30,  0, 10, 20, 30,
             0, 10, 20, 30]])
    
函數模塊
  • numpy.linalg模塊包含線性代數的函數。使用這個模塊,可以計算逆矩陣、求特徵值、解線性方程組以及求解行列式等

    • 對矩陣求逆

      使用numpy.linalg模塊中的inv函數計算了逆矩陣,並檢查了原矩陣與求得的逆矩陣相乘的結果確爲單位矩陣。

      eg:
      A = np.mat("0 1 2;1 0 3;4 -3 8") #使用mat函數創建矩陣
      ## 求逆
      inverse = np.linalg.inv(A)
      
    • numpy.linalg中的函數solve可以求解形如 Ax= b 的線性方程組,其中 A爲矩陣,b爲一維或二維的數組,x是未知變量
      eg:
      A = np.mat("0 1 2;1 0 3;4 -3 8") #使用mat函數創建矩陣
      b = np.array([0, 8, -9])
      ## 求解
      x = np.linalg.solve(A, b)
    
    • 特徵值和特徵向量——eigvals函數

      特徵值(eigenvalue)即方程 Ax= ax 的根,是一個標量。其中,A 是一個二維矩陣,x 是一個一維向量。特徵向量(eigenvector)是關於特徵值的向量。在numpy.linalg模塊中,eigvals函數可以計算矩陣的特徵值,而eig函數可以返回一個包含特徵值和對應的特徵向量的元組。

    • 奇異值分解
      在numpy.linalg模塊中的svd函數可以對矩陣進行奇異值分解。該函數返回3個矩陣——U、Sigma和V,其中U和V是正交矩陣,Sigma包含輸入矩陣的奇異值。
小結
  • 特徵信息

    X.flags    #數組的存儲情況信息。
    
    X.shape    #結果是一個tuple,返回本數組的行數、列數、……
    
    X.ndim   #數組的維數,結果是一個數。
    
    X.size    #數組中元素的數量
    
    X.itemsize    #數組中的數據項的所佔內存空間大小
    
    X.dtype    #數據類型
    
    X.T   #如果X是矩陣,發揮的是X的轉置矩陣
    
    X.trace()    #計算X的跡
    
    np.linalg.det(a)   #返回的是矩陣a的行列式
    
    np.linalg.norm(a,ord=None)    #計算矩陣a的範數
    
    np.linalg.eig(a)    #矩陣a的特徵值和特徵向量
    
    np.linalg.cond(a,p=None)    #矩陣a的條件數
    
    np.linalg.inv(a)    #矩陣a的逆矩陣
    
  • 索引

    x=np.arange(10)
    
    print x[2]    #單個元素,從前往後正向索引。注意下標是從0開始的。
    
    print x[-2]    #從後往前索引。最後一個元素的下標是-1
    
    print x[2:5]    #多個元素,左閉右開,默認步長值是1
    
    print x[:-7]    #多個元素,從後向前,制定了結束的位置,使用默認步長值
    
    print x[1:7:2]   #指定步長值
    
    x.shape=(2,5)    #x的shape屬性被重新賦值,要求就是元素個數不變。2*5=10
    
    print x[1,3]    #二維數組索引單個元素,第2行第4列的那個元素
    
    print x[0]   #第一行所有的元素
    
    y=np.arange(35).reshape(5,7)    #reshape()函數用於改變數組的維度
    
    print y[1:5:2,::2]    #選擇二維數組中的某些符合條件的元素
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章