python中numpy庫的簡單使用


一、Numpy介紹

NumPy是Python中科學計算的基礎包,它的核心是 ndarray(多維數組)對象,簡稱數組。數組由同種類型的元素組成,可以通過整數元組進行索引。在Numpy中,維度稱為軸(axis),軸的個數稱為秩(rank).。比如[1,2,3]是一維數組,具有一個軸,由3個元素組成,即它的長度為3。二維數組由1或多個一維數組組成,比如[[1,2,3],[2,3,4]]。三維數組由1或多個二維數組組成,以此類推。

二、安裝

pip install numpy

三、數組創建

  • np.array()

    >>> import numpy as np >>> np.array([1,2,3],dtype=int) #創建一維數組,可指定元素類型
    array([1, 2, 3]) >>> np.array([[1,2,3],[4,5,6]]) #創建二維數組
    array([[1, 2, 3], [4, 5, 6]]) #同理創建多維數組
  • np.random.rand(m,n)或者np.random.random((m,n))------創建m行n列,由0-1的隨機數構成的數組,注意后者傳入的參數是一個元組

    >>> np.random.rand(2,3) array([[0.96520381, 0.3969341 , 0.36751751], [0.33390612, 0.46732563, 0.54680012]])
  • np.arange(start,stop,step)------創建一維數組,用法同python中的range

    >>> np.arange(10)
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(1,10) #左閉右開區間 array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(1,10,2)#指定步幅為2 array([1, 3, 5, 7, 9])
  • np.linspace(start,stop,num)------指定起止值,創建指定個數的等差一維數組

    >>> np.linspace(10,100,6) array([ 10.,  28.,  46.,  64.,  82., 100.])
  • np.ones((m,n))-----------創建一個m行n列的全1數組

    >>> np.ones((3,4)) array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]])
  • np.zeros((m,n))--------------創建一個m行n列的全0數組

    >>> np.zeros((2,3)) array([[0., 0., 0.], [0., 0., 0.]])
  • np.indices((m,n))---------創建m行,n列的3維數組;如果參數元組內傳入i個元素,則創建(i+1)維數組,內部元素為i個i維數組

    >>> np.indices((2,3)) array([[[0, 0, 0], [1, 1, 1]], [[0, 1, 2], [0, 1, 2]]])

四、數組堆疊與拆分

  • 堆疊

    • np.vstack() - 行堆疊

    • np.hstack() - 列堆疊

      >>> m array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> n array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) >>> np.vstack((m,n)) array([[ 0, 1,  2,  3,  4,  5,  6,  7,  8,  9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]) >>> np.hstack((m,n)) array([ 0, 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
  • 拆分

    • np.vsplit() - 行拆分,即沿垂直軸拆分,可以指定平均拆分成幾等分,也可以通過元組中的元素來指定從哪些行后面進行拆分

    • np.hsplit() - 列拆分,即沿水平軸拆分,可以指定平均拆分成幾等分,也可以通過元組中的元素來指定從哪些列后面進行拆分

      >>> a array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> np.vsplit(a,3) #按行拆分成3等分
      [array([[0, 1, 2, 3, 4]]), array([[5, 6, 7, 8, 9]]), array([[10, 11, 12, 13, 14]])] >>> np.vsplit(a,(2,)) #從第2行后面進行拆分
      [array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]), array([[10, 11, 12, 13, 14]])] >>> np.hsplit(a,5) #按列拆分成5等分
      [array([[ 0], [ 5], [10]]), array([[ 1], [ 6], [11]]), array([[ 2], [ 7], [12]]), array([[ 3], [ 8], [13]]), array([[ 4], [ 9], [14]])] >>> np.hsplit(a,(2,3)) #分別從第二列和第3列后進行拆分
      [array([[ 0,  1], [ 5,  6], [10, 11]]), array([[ 2], [ 7], [12]]), array([[ 3,  4], [ 8,  9], [13, 14]])]

五、運算

  • 算數運算:+,-,*,/,//,%,**-------------每個數組中對應元素進行運算

    >>> a = np.array([1,2,3,4])
    >>> b = np.array([5,6,7,8])
    >>> a+b
    array([ 6,  8, 10, 12])
    >>> a-b
    array([-4, -4, -4, -4])
    >>> a*b
    array([ 5, 12, 21, 32])
    >>> a/b
    array([0.2       , 0.33333333, 0.42857143, 0.5       ])
    >>> a//b
    array([0, 0, 0, 0])
    >>> a%b
    array([1, 2, 3, 4])
    >>> a**2
    array([ 1,  4,  9, 16])
  • 比較運算:==,<,<=,>,>=,!=----------------------數組中每個元素都進行相應比較,返回bool值組成的數組

    >>> a
    array([1, 2, 3, 4])
    >>> a==2
    array([False,  True, False, False])
    >>> a>2
    array([False, False,  True,  True])
    >>> a>=2
    array([False,  True,  True,  True])
    • 邏輯運算:邏輯與(&),邏輯或(|),邏輯非(~)

      >>> a = np.arange(15).reshape(3,5)
      >>> a
      array([[ 0,  1,  2,  3,  4],
             [ 5,  6,  7,  8,  9],
             [10, 11, 12, 13, 14]])
      >>> (a>3)&(a<10)
      array([[False, False, False, False,  True],
             [ True,  True,  True,  True,  True],
             [False, False, False, False, False]])
      >>> (a<3)|(a>10)
      array([[ True,  True,  True, False, False],
             [False, False, False, False, False],
             [False,  True,  True,  True,  True]])
      >>> a[~(a%2==0)]
      array([ 1,  3,  5,  7,  9, 11, 13])

六、索引和切片

  • 一維數組

    • 同python列表操作一樣

    • x[i]---x數組中索引為i的元素,索引從0開始

    • x[-i]---索引倒數第i個元素

    • x[m:n]--不包含索引為n的元素

    • x[m:n:i]--指定步幅為i

      >>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[2] 2
      >>> a[-1] 9
      >>> a[3:8] array([3, 4, 5, 6, 7]) >>> a[3:8:2] array([3, 5, 7])
  • 多維數組

    • 每個軸可以有一個索引。這些索引以逗號​​分隔的元組給出,當提供的索引少於軸的數量時,缺失的索引被認為是完整的切片:

    • 以二維數組為例:

      >>> a array([[ 1,   2,   3,   4], [ 10,  20,  30,  40], [100, 200, 300, 400]]) >>> a[2] #取第3行數據
      array([100, 200, 300, 400]) >>> a[:,2] #取第3列數據
      array([  3,  30, 300]) >>> a[0:2,2] #取前2行第3個數
      array([ 3, 30]) >>> a[1,2] #取第2行第3個數
      30
  • 索引數組

    • 單個索引數組

      • 只對第1個維度進行索引操作

      • 結果形式:將索引數組里面的每個索引值,替換成數組被該索引值所索引的結果

      • 以x數組為例,索引數組為一維數組np.array([1,1,3,4]),那么x[np.array([1,2,3,4])]----結果為array([x[1],x[1],x[3],x[4]])

      • 以x數組為例,索引數組為二維數組[[1,1],[3,4]],那么x[[[1,1],[3,4]]]----結果為[[x[1],x[1]],[x[3],x[4]]]

        >>> a = np.linspace(2,20,10,dtype=int) >>> a array([ 2,  4,  6,  8, 10, 12, 14, 16, 18, 20]) >>> a[[1,2,3,4]] #傳入列表索引和一維數組索引等效
        array([ 4,  6,  8, 10]) >>> a[np.array([1,2,3,4])] #索引數組為一維數組
        array([ 4,  6,  8, 10]) >>> a[np.array([[1,2],[3,4]])]#索引數組為二維數組
        array([[ 4,  6], [ 8, 10]])
    • 多個索引數組

      • 為多個維度提供索引,每個維度的索引數組必須具有相同的形狀 。

        >>> a = np.indices((2,3)) #創建一個3維數組
        >>> a array([[[0, 0, 0], [1, 1, 1]], [[0, 1, 2], [0, 1, 2]]]) >>> a[np.array([0,1]),np.array([0,1])] #對前兩個維度進行索引,結果相當於np.array([a[0][0],a[1][1]])
        array([[0, 0, 0], [0, 1, 2]]) >>> a[np.array([0,1]),np.array([0,1]),np.array([1,2])] #對3個維度分別索引,結果相當於np.array(a[0][0][1],a[1][1][2])
        array([0, 2])
  • 索引數組和整數相結合

    • 將整數理解為和索引數組等長的以該整數為元素的數組

      >>> a = np.array([[1,2,3],[2,3,4],[3,4,5]]) >>> a array([[1, 2, 3], [2, 3, 4], [3, 4, 5]]) >>> a[np.array([1,2]),2] array([4, 5]) >>> a[np.array([1,2]),np.array([2,2])] array([4, 5]) >>> a[1,np.array([1,2])] array([3, 4]) >>> a[[1,1],np.array([1,2])] array([3, 4])
  • 布爾索引

    • 與原始數組具有相同形狀的布爾數組

      • 在獲取元素的時候,只返回索引值為True的元素所組成的數組,其它元素舍棄

        >>> a array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> b = a > 3
        >>> b array([[False, False, False, False, True], [ True, True, True, True, True], [ True, True, True, True, True]]) >>> a[b] #返回a中大於3的元素所組成的數組
        array([ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]) >>> a[b] = 0 #賦值,只對索引數組中元素為True的位置進行賦值
        >>> a array([[0, 1, 2, 3, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
    • 對於數組的每個維度,給出一個一維布爾數組以及想要的切片

      • 請注意,一維布爾數組的長度必須與要切片的尺寸(或軸)的長度一致

        >>> a = np.arange(15).reshape((3,5)) >>> a array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> b1 = np.array([True,False,True]) >>> b2 = np.array([True,False,True,False,True]) >>> a[b1,:] array([[ 0, 1,  2,  3,  4], [10, 11, 12, 13, 14]]) >>> a[:,b2] array([[ 0, 2,  4], [ 5,  7,  9],

七、數組常用屬性和方法

  • 常用屬性

    • ndim - 數組的軸(維度)的個數

    • shape - 數組的維度。這是一個整數的元組,表示每個維度中數組的大小。對於m行n列的矩陣數組,返回的是(m,n)

    • size - 數組中所有元素的個數,等於shape的元素的乘積

    • dtype - 數組中元素類型的對象,可以繼續通過該對象的name屬性來獲取元素類型的名稱

    • itemsize - 數組中每個元素的字節大小,比如元素類型為int64的數組,每個元素的字節大小為64/8=8個字節

    • T - 轉置操作,不修改原數組

      >>> a = np.arange(15).reshape((3,5)) >>> a array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> a.ndim 2
      >>> a.shape (3, 5) >>> a.size 15
      >>> a.dtype dtype('int64') >>> a.dtype.name 'int64'
      >>> a.itemsize 8
      >>> a.T array([[ 0, 5, 10], [ 1,  6, 11], [ 2,  7, 12], [ 3,  8, 13], [ 4,  9, 14]])
  • 常用方法

    • tolist() - 轉換成python列表

    • astype(類型) - 轉換數組元素類型

    • min() - 求所有元素最小值,返回單個值

    • max() - 求所有元素最大值

    • sum() - 求總和

    • mean() - 求平均值

    • min(axis) - 參數axis=1,按行求最小值,axis=0,按列求最小值,返回數組類型

    • max(axis) - 同上,求最大值

    • mean(axis=None) - 同上,求均值

    • argmin() - 求最小值所對應的索引值,如果是多維數組,則為拆分為一維數組后的索引值

    • argmin(axis) - 參數axis=1,按行求最小值所對應的索引值,axis=0,按列求最小值所對應的索引值,返回數組類型

    • argmax() - 同上,求最大值對應索引值

    • argmax(axis) - 同上,求最大值對應索引值,返回數組類型

    • view() - 視圖,淺拷貝

    • copy()- 深拷貝

    • reshape() - 修改數組形狀,但不會修改原數組,比如reshape(m,n)表示修改原數組為m行n列的二維數組

    • resize() - 修改數組形狀,並且會修改原數組

    • ravel() - 返回數組降維后的一維數組,但不會修改原數組

    • flatten() - 同ravel(),返回數組降維后的一維數組,但不會修改原數組

      >>> a = np.arange(15) #創建一個一維數組
      >>> a array([ 0, 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]) >>> a.tolist() #轉成python列表形式
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] >>> a.astype(float) #轉換數組元素類型為float類型
      array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13., 14.]) >>> b = a.reshape(3,5) #修改數組為3行5列的二維數組
      >>> b array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> a #reshape后,沒有修改原數組
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]) >>> a.resize(3,5) #resize修改了原數組
      >>> a array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> a.max() #返回數組內元素最大值
      14
      >>> a.argmax() #返回最大值在一維數組中的索引值
      14
      >>> a.argmax(axis=1) #按行求最大值所對應的索引值
      array([4, 4, 4]) >>> a.ravel() #降維成一維數組
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]) >>> a.flatten() #降維成一維數組
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]) >>> a #ravel()和flatten()都沒有修改原數組
      array([[ 0,  1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> c = a.copy() #對a進行深拷貝
      >>> d = a.view() #對a進行淺拷貝
      >>> c array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> d array([[ 0, 1,  2,  3,  4], [ 5,  6,  7,  8,  9], [10, 11, 12, 13, 14]]) >>> c[c==1] = 1111 #將深拷貝過的c數組中元素1修改為1111
      >>> d[d==2] = 222 #將淺拷貝過的d數組中元素2修改為222
      >>> a #修改淺拷貝過的數組,a數組中的元素發生相應變化
      array([[  0,   1, 222,   3,   4], [ 5,   6,   7,   8,   9], [ 10,  11,  12,  13,  14]]) 

以上介紹的只是numpy的部分知識,想深入了解numpy,可參考numpy中文文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM