天天看點

資料分析手冊-numpy數組(1)

numpy數組(import numpy as np)

  1. 常見的建立數組函數
    np.zeros (10, dtype=int)--建立一個長度為10的數組,數組的值都是0
    
    np.ones((3,5), dtype=float)--建立一個3×5的浮點型數組,數組的值都是1
    
    np.full((3, 5),3.14) --建立一個3×5的浮點型數組,數值都是3.14
    
    np.arrge(0,20,2)--建立一個線性序列數組;從0開始,到20結束,步長為2;(它和内置的range函數類似)
    
    np.linspace(0,1,5)--建立一個5個元素的數組,這5個數均勻地配置設定到0~1
    
    np.random.random((3,3))--建立一個3×3的、在0~1均勻分布的随機數組成的數組
    
    np.random.normal(0,1,(3,3))--建立一個3×3的、均值為0、标準差為1的正太分布的随機數數組
    
    np.random.randint(0,10,(3,3))--建立一個3×3的、[0,10)區間的随機整型數組
    
    np.eye(3)--建立一個3×3的機關矩陣
    
    mp.empty(3)--建立一個由3個整型數組成的未初始化的數組;數組的值是記憶體空間中的任意值
       
               
    1. 通過設定種子來讓生成的随機數可預測
      import numpy as np
      np.random.seed(0)
      x1=np.random.randint(10,size=6)
      x2=np.random.randint(10,size=(3,4))
      x3=np.random.randint(10,size=(3,4,5))
      print(x1)
      print("-----")
      print(x2)
      print("-----")
      print(x3)
      print("-----")
      
                 
    2. 數組處理
      1. 利用數組切片擷取子數組

      X[start:stop:step]– 其預設值分别為0,數組長度(SIZE OF THE DIMENSION)、1

      在步長為負數的時候,預設start和stop會進行交換,進而進行反向切割-也就是逆序數組

      對于多元子數組,同樣可以使用多元切片來進行處理。用逗号進行分隔

      x2[:2, :3] #兩行三列
      
      x2[::-1, ::-1] #從最後一個數開始進行逆序切
                 
      1. 擷取數組的單行和單列
        x2[:, 0] #擷取數組的第一列
        x2[0]=x2[0, :]#擷取數組的第一行 解釋:逗号前面0代表索引0第一行,後面是列,不寫代表整個這一列
                   

​ 3 .numpy數組切片切到的子數組傳回的是原數組的視圖而不是副本

​ --意思是我們修改切割得到的子數組,原數組相應的子數組的值也會發生改變

​ --意義在于當我們處理非常大的資料集時,可以擷取或處理這些資料集的片段,而不用複制底層的資料緩存

​ 4. 建立數組的副本

​ --明确地複制數組裡地資料或子數組有時也是非常有用地,可以通過copy()來進行實作

​ 5. 數組的變形

數組變形最靈活的實作方式是通過reshape() 函數來實作,這傳回的是**原始數組的非副本視圖**。

grid=np.arange(1,10).reshape((3,3))
print(grid)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
           

attention! 該方法可行的前提條件是原始數組的大小必須和變形後數組的大小一緻。如果滿足此條件的話,reshape方法将會用到原始數組的一個非副本視圖。然而實際情況一般**都是處理非連續的資料緩存**,是以傳回非副本視圖往往是實作不了的。

另外一種比較常見的變形方式是将一個一維的數組轉變為二維的行或列的矩陣–可以通過reshape()方法或者在一個切片操作中使用newaxis關鍵字

x=np.array([1,2,3])
#通過變形獲得行向量
x.reshape((1,3))
#通過newaxis獲得行向量
x[np.newaxis, :]
#通過變形獲得列向量
x.reshape((3,1))
#通過newaxis獲得列向量
x[:, np.newaxis]
           
  1. 數組拼接和分列

    以上所有操作都是針對單一數組的,但有時也需要将多個數組合并為一個,或将一個數組分裂成多個

    1. 數組的拼接

    拼接或連接配接numpy中的兩個數組主要由np.concatenate、np.vstack和np.hstack例程實作。

    ​ np.concatenate–使連接配接的意思

    np.concatenate将數組元組或數組清單作為第一個參數
    x=np.array([1,2,3])
    y=np.array([3,2,1])
    np.concatenate([x,y])
    # 也可以一次性拼接兩個以上數組:
        z=[99,99,99]
        print(np.concatenate([x,y,z]))
    # 也可以用于二維數組的拼接
        grid=np.array([[1,2,3],
                       [4,5,6]])
    # 沿着第一個軸拼接
        np.concatenate([grid,grid])
    # 沿着第二個軸拼接 (從0開始索引)
        np.concatenate([grid,grid], axis=1)
               
    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-efmKwvis-1606470000248)(C:\Users\QXY\AppData\Roaming\Typora\typora-user-images\image-20201127171731980.png)]

沿着固定次元處理數組時,使用np.vstack(垂直棧)和np.hstack(水準棧)函數會更簡潔 面向代碼塊程式設計

x=np.array([1,2,3])
grid=np.array([[9,8,7],
               [6,5,4]])
# 垂直棧數組
np.vstack([x,grid])
#
out:array([[1,2,3],
           [9,8,7]
           [6,5,4]])
# 水準棧數組
y=np.array([[99],
            [99]])
np.hstack([grid,y])
#
out:array([[9,8,7,99],
           [6,5,4,99]])
           

推廣之,np.dstack将沿着第三個次元拼接數組

  1. 數組的分裂

    與拼接相反的過程是分裂。分裂可以通過np.split、np.hsplit和np.vsplit函數來實作

    可以向以上函數傳遞一個索引清單作為參數,索引清單記錄的是分裂點位置:

    x=[1,2,3,99,99,3,2,1]
    x1,x2,x3=np.split(x,[3,5])
    #out:
    [1,2,3] [99,99] [3,2,1]
               
    **attention!**值得注意的是,n個分裂點會得到n+1個數組,相關的np.hsplit和np.vsplit的用法也較為類似:
    grid=np.arange(16).reshape((4,4))
    #out
    array([[0,1,2,3],
     [4,5,6,7],
     [8,9,10,11],
     [12,13,14,15]])
    upper,lower=np.vsplit(grid,[2]) vsplit--從第三列處水準分割
    print(upper)
    print(lower)
    #out
    [[0 1 2 3]
     [4 5 6 7]]
    [[8 9 10 11]
     [12 13 14 15]]
    left,right=np.hsplit(grid,[2])
    print(left)
    print(right)
    #out
    [[ 0 1]
     [ 4 5]
     [ 8 9]
     [12 13]]
    [[ 2 3]
     [ 6 7]
     [10 11]
     [14 15]]
               

同樣,np.dsplit可以将數組沿着第三個次元進行分裂