1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        清晰易懂的Numpy入門教程

        共 9553字,需瀏覽 20分鐘

         ·

        2021-05-25 16:29


        點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        本文轉(zhuǎn)自|視覺(jué)算法

        Numpy是python語(yǔ)言中最基礎(chǔ)和最強(qiáng)大的科學(xué)計(jì)算和數(shù)據(jù)處理的工具包,如數(shù)據(jù)分析工具pandas也是基于numpy構(gòu)建的,機(jī)器學(xué)習(xí)包scikit-learn也大量使用了numpy方法。本文介紹了Numpy的n維數(shù)組在數(shù)據(jù)處理和分析的所有核心應(yīng)用。


        目錄


        1. 如何構(gòu)建numpy數(shù)組

        2. 如何觀察數(shù)組屬性的大小和形狀(shape)

        3. 如何從數(shù)組提取特定的項(xiàng)

        4. 如何從現(xiàn)有的數(shù)組定義新數(shù)組

        5. 多維數(shù)組的重構(gòu)(reshaping)和扁平(flattening)

        6. 如何通過(guò)numpy生成序列數(shù)(sequences),重復(fù)數(shù)(repetitions)和隨機(jī)數(shù)(random)

        7. 小結(jié)



        1. 如何構(gòu)建numpy數(shù)組



        構(gòu)建numpy數(shù)組的方法很多,比較常用的方法是用np.array函數(shù)對(duì)列表進(jìn)行轉(zhuǎn)化。

        # 通過(guò)列表創(chuàng)建一維數(shù)組
        import numpy as np
        list1 = [0,1,2,3,4]
        arr1d = np.array(list1)

        #打印數(shù)組和類型
        print(type(arr1d))
        arr1d
        <type 'numpy.ndarray'>
        [0 1 2 3 4]

        數(shù)組和列表最關(guān)鍵的區(qū)別是:數(shù)組是基于向量化操作的,列表不是,我們?cè)趯?shí)際項(xiàng)目中處理的數(shù)據(jù)一般是矩陣結(jié)構(gòu),對(duì)該數(shù)據(jù)以行向量或列向量的形式進(jìn)行計(jì)算,向量計(jì)算是基于數(shù)組實(shí)現(xiàn)的,因此數(shù)組比列表的應(yīng)用更廣。

        函數(shù)可以應(yīng)用到數(shù)組的每一項(xiàng),列表不行。

        比如,不可以對(duì)列表的每一項(xiàng)數(shù)據(jù)都加2,這是錯(cuò)誤的。

        list1 + 2  # 錯(cuò)誤

        可以對(duì)數(shù)組的某一項(xiàng)數(shù)據(jù)都加2

        # Add 2 to each element of arr1d
        arr1d + 2

        #> array([2, 3, 4, 5, 6])

        另一個(gè)區(qū)別是已經(jīng)定義的numpy數(shù)組不可以增加數(shù)組大小,只能通過(guò)定義另一個(gè)數(shù)組來(lái)實(shí)現(xiàn),但是列表可以增加大小。

        然而,numpy有更多的優(yōu)勢(shì),讓我們一起來(lái)發(fā)現(xiàn)。

        numpy可以通過(guò)列表中的列表來(lái)構(gòu)建二維數(shù)組。

        # Create a 2d array from a list of lists
        list2 = [[0,1,2], [3,4,5], [6,7,8]]
        arr2d = np.array(list2)
        arr2d

        #> array([[0, 1, 2],
        #> [3, 4, 5],
        #> [6, 7, 8]])

        你也可以通過(guò)dtype參數(shù)指定數(shù)組的類型,一些最常用的numpy類型是:'float','int','bool','str'和'object'。

        # Create a float 2d array
        arr2d_f = np.array(list2, dtype='float')
        arr2d_f

        #> array([[ 0., 1., 2.],
        #> [ 3., 4., 5.],
        #> [ 6., 7., 8.]])

        輸出結(jié)果的小數(shù)點(diǎn)表示float類型,你也可以通過(guò) astype方法轉(zhuǎn)換成不同的類型。

        # 轉(zhuǎn)換成‘int’類型
        arr2d_f.astype('int')

        #> array([[0, 1, 2],
        #> [3, 4, 5],
        #> [6, 7, 8]])
        # 先轉(zhuǎn)換‘int’類型,再轉(zhuǎn)換‘str’類型
        arr2d_f.astype('int').astype('str')

        #> array([['0', '1', '2'],
        #> ['3', '4', '5'],
        #> ['6', '7', '8']],
        #> dtype='U21')

        另一個(gè)區(qū)別是數(shù)組要求所有項(xiàng)是同一個(gè)類型,list沒(méi)有這個(gè)限制。如果你想要一個(gè)數(shù)組包含不同類型,設(shè)置‘dtype’為'object'。

        # 構(gòu)建布爾類型數(shù)組
        arr2d_b = np.array([1, 0, 10], dtype='bool')
        arr2d_b

        #> array([ True, False, True], dtype=bool)
        # 構(gòu)建包含數(shù)值和字符串的數(shù)組
        arr1d_obj = np.array([1, 'a'], dtype='object')
        arr1d_obj

        #> array([1, 'a'], dtype=object)

        最終使用 tolist()函數(shù)使數(shù)組轉(zhuǎn)化為列表。

        # Convert an array back to a list
        arr1d_obj.tolist()

        #> [1, 'a']

        總結(jié)數(shù)組和列表主要的區(qū)別:

        1. 數(shù)組支持向量化操作,列表不支持;

        2. 數(shù)組不能改變長(zhǎng)度,列表可以;

        3. 數(shù)組的每一項(xiàng)都是同一類型,list可以有多種類型;

        4. 同樣長(zhǎng)度的數(shù)組所占的空間小于列表;

        2. 如何觀察數(shù)組屬性的大小和形狀(shape)



        一維數(shù)組由列表構(gòu)建,二維數(shù)組arr2d由列表的列表構(gòu)建,二維數(shù)組有行和列,比如矩陣,三維數(shù)組由嵌入了兩個(gè)列表的列表構(gòu)建。

        假設(shè)給定一個(gè)數(shù)組,我們?cè)趺慈チ私庠摂?shù)組的屬性。

        數(shù)組的屬性包括:

        數(shù)組的維度(ndim)

        數(shù)組的形狀(shape)

        數(shù)組的類型(dtype)

        數(shù)組的大?。╯ize)

        數(shù)組元素的表示(通過(guò)索引)

        # 定義3行4列的二維數(shù)組
        list2 = [[1, 2, 3, 4],[3, 4, 5, 6], [5, 6, 7, 8]]
        arr2 = np.array(list2, dtype='float')
        arr2

        #> array([[ 1., 2., 3., 4.],
        #> [ 3., 4., 5., 6.],
        #> [ 5., 6., 7., 8.]])
        # 形狀(shape)
        print('Shape: ', arr2.shape)

        # 數(shù)組類型(dtype)
        print('Datatype: ', arr2.dtype)

        # 數(shù)組大小(size)
        print('Size: ', arr2.size)

        # 數(shù)組維度(ndim)
        print('Num Dimensions: ', arr2.ndim)

        # 取數(shù)組第3行3列元素
        print('items of 3 line 3 column: ', c[2,2])

        #> Shape: (3, 4)
        #> Datatype: float64
        #> Size: 12
        #> Num Dimensions: 2
        #> items of 3 line 3 column: 7


        3. 如何從數(shù)組提取特定的項(xiàng)



        數(shù)組的索引是從0開(kāi)始計(jì)數(shù)的,與list類似。numpy數(shù)組通過(guò)方括號(hào)的參數(shù)以選擇特定的元素。

        # 選擇矩陣的前兩行兩列
        arr2[:2, :2]
        list2[:2, :2] # 錯(cuò)誤

        #> array([[ 1., 2.],
        #> [ 3., 4.]])

        numpy數(shù)組支持布爾類型的索引,布爾型索引數(shù)組與過(guò)濾前(array-to-be-filtered)的數(shù)組大小相等,布爾型數(shù)組只包含Ture和False變量,Ture變量對(duì)應(yīng)的數(shù)組索引位置保留了過(guò)濾前的值 。

        arr2

        #> array([[ 1., 2., 3., 4.],
        #> [ 3., 4., 5., 6.],
        #> [ 5., 6., 7., 8.]])
        # 對(duì)數(shù)組每一個(gè)元素是否滿足某一條件,然后獲得布爾類型的輸出
        b = arr2 > 4
        b

        #> array([[False, False, False, False],
        #> [False, False, True, True],
        #> [ True, True, True, True]], dtype=bool)
        # 取布爾型數(shù)組保留的原始數(shù)組的值
        arr2[b]

        #> array([ 5., 6., 5., 6., 7., 8.])

        3.1 如何反轉(zhuǎn)數(shù)組


        # 反轉(zhuǎn)數(shù)組的行
        arr2[::-1, ]

        #> array([[ 5., 6., 7., 8.],
        #> [ 3., 4., 5., 6.],
        #> [ 1., 2., 3., 4.]])
        # Reverse the row and column positions
        # 反轉(zhuǎn)數(shù)組的行和列
        arr2[::-1, ::-1]

        #> array([[ 8., 7., 6., 5.],
        #> [ 6., 5., 4., 3.],
        #> [ 4., 3., 2., 1.]])

        3.2 如何處理數(shù)組的缺失值(missing)和無(wú)窮大(infinite)值


        缺失值可以用np.nan對(duì)象表示,np.inf表示無(wú)窮大值,下面用二維數(shù)組舉例:

        # 插入nan變量和inf變量
        arr2[1,1] = np.nan # not a number
        arr2[1,2] = np.inf # infinite
        arr2

        #> array([[ 1., 2., 3., 4.],
        #> [ 3., nan, inf, 6.],
        #> [ 5., 6., 7., 8.]])
        # 用-1代替nan值和inf值
        missing_bool = np.isnan(arr2) | np.isinf(arr2)
        arr2[missing_bool] = -1
        arr2

        #> array([[ 1., 2., 3., 4.],
        #> [ 3., -1., -1., 6.],
        #> [ 5., 6., 7., 8.]])

        3.3 如何計(jì)算n維數(shù)組的平均值,最小值和最大值


        # 平均值,最大值,最小值
        print("Mean value is: ", arr2.mean())
        print("Max value is: ", arr2.max())
        print("Min value is: ", arr2.min())

        #> Mean value is: 3.58333333333
        #> Max value is: 8.0
        #> Min value is: -1.0

        如果要求數(shù)組的行或列的最小值,使用np.amin函數(shù)

        # Row wise and column wise min
        # 求數(shù)組行和列的最小值
        # axis=0表示列,1表示行
        print("Column wise minimum: ", np.amin(arr2, axis=0))
        print("Row wise minimum: ", np.amin(arr2, axis=1))

        #> Column wise minimum: [ 1. -1. -1. 4.]
        #> Row wise minimum: [ 1. -1. 5.]

        對(duì)數(shù)組的每個(gè)元素進(jìn)行累加,得到一維數(shù)組,一維數(shù)組的大小與二維數(shù)組相同。

        # 累加
        np.cumsum(arr2)

        #> array([ 1., 3., 6., 10., 13., 12., 11., 17., 22., 28., 35., 43.])


        4. 如何從現(xiàn)有的數(shù)組定義新數(shù)組



        如果使用賦值運(yùn)算符從父數(shù)組定義新數(shù)組,新數(shù)組與父數(shù)組共占同一個(gè)內(nèi)存空間,如果改變新數(shù)組的值,那么父數(shù)組也相應(yīng)的改變。

        為了讓新數(shù)組與父數(shù)組相互獨(dú)立,你需要使用copy()函數(shù)。所有父數(shù)組都使用copy()方法構(gòu)建新數(shù)組。

        # Assign portion of arr2 to arr2a. Doesn't really create a new array.
        # 分配arr2數(shù)組給新數(shù)組arr2a,下面方法并沒(méi)有定新數(shù)組
        arr2a = arr2[:2,:2]
        arr2a[:1, :1] = 100 # arr2相應(yīng)位置也改變了
        arr2

        #> array([[ 100., 2., 3., 4.],
        #> [ 3., -1., -1., 6.],
        #> [ 5., 6., 7., 8.]])
        # 賦值arr2數(shù)組的一部分給新數(shù)組arr2b
        arr2b = arr2[:2, :2].copy()
        arr2b[:1, :1] = 101 # arr2沒(méi)有改變
        arr2

        #> array([[ 100., 2., 3., 4.],
        #> [ 3., -1., -1., 6.],
        #> [ 5., 6., 7., 8.]])


        5. 多維數(shù)組的重構(gòu)(reshaping)和扁平(flattening)



        重構(gòu)(reshaping)是改變了數(shù)組項(xiàng)的排列,即改變了數(shù)組的形狀,未改變數(shù)組的維數(shù)。

        扁平(flattening)是對(duì)多維數(shù)組轉(zhuǎn)化為一維數(shù)組。

        # 3x4數(shù)組重構(gòu)為4x3數(shù)組
        arr2.reshape(4, 3)

        #> array([[ 100., 2., 3.],
        #> [ 4., 3., -1.],
        #> [ -1., 6., 5.],
        #> [ 6., 7., 8.]])

        5.1 flatten()和ravel()的區(qū)別

        數(shù)組的扁平化有兩種常用的方法,flatten()和ravel() 。flatten處理后的數(shù)組是父數(shù)組的引用,因此新數(shù)組的任何變化也會(huì)改變父數(shù)組,因其未用復(fù)制的方式構(gòu)建數(shù)組,內(nèi)存使用效率高,ravel通過(guò)復(fù)制的方式構(gòu)建新數(shù)組。

        # flatten方法
        arr2.flatten()

        #> array([ 100., 2., 3., 4., 3., -1., -1., 6., 5., 6., 7., 8.])
        # flatten方法
        b1 = arr2.flatten()
        b1[0] = 100 # 改變b1的值并未影響arr2
        arr2

        #> array([[ 100., 2., 3., 4.],
        #> [ 3., -1., -1., 6.],
        #> [ 5., 6., 7., 8.]])
        # ravel方法
        b2 = arr2.ravel()
        b2[0] = 101 # 改變b2值,相應(yīng)的改變了arr2值
        arr2

        #> array([[ 101., 2., 3., 4.],
        #> [ 3., -1., -1., 6.],
        #> [ 5., 6., 7., 8.]])
        6. 如何通過(guò)numpy生成序列數(shù)(sequences),重復(fù)數(shù)(repetitions)和隨機(jī)數(shù)(random)



        np.arrange函數(shù)手動(dòng)生成指定數(shù)目的序列數(shù),與ndarray作用一樣。

        # 默認(rèn)下限為0
        print(np.arange(5))

        # 0 to 9,默認(rèn)步數(shù)為1
        print(np.arange(0, 10))

        # 遞增步數(shù)2
        print(np.arange(0, 10, 2))

        # 降序
        print(np.arange(10, 0, -1))

        #> [0 1 2 3 4]
        #> [0 1 2 3 4 5 6 7 8 9]
        #> [0 2 4 6 8]
        #> [10 9 8 7 6 5 4 3 2 1]

        上例是通過(guò)np.arrange設(shè)置初始位置和結(jié)束位置來(lái)生成序列數(shù),如果我們?cè)O(shè)置數(shù)組的元素個(gè)數(shù),那么可以自動(dòng)計(jì)算數(shù)組的遞增值。

        如構(gòu)建1到50的數(shù)組,數(shù)組有10個(gè)元素,使用np.linspace總動(dòng)計(jì)算數(shù)組的遞增值。

        # 起始位置和結(jié)束位置分別為1和50
        np.linspace(start=1, stop=50, num=10, dtype=int)

        #> array([ 1, 6, 11, 17, 22, 28, 33, 39, 44, 50])

        我們注意到上面例子的遞增值并不相等,有5和6兩個(gè)值,原因是計(jì)算遞增值采用了四舍五入的算法(rounding)。與np.linspace類似,np.logspace以對(duì)數(shù)尺度的方式增長(zhǎng)。

        # 設(shè)置數(shù)組的精度為小數(shù)點(diǎn)后兩位
        np.set_printoptions(precision=2)

        # 起點(diǎn)為 10^1 and 終點(diǎn)為 10^50,數(shù)組元素個(gè)數(shù)10,以10為底數(shù)
        np.logspace(start=1, stop=50, num=10, base=10)

        #> array([ 1.00e+01, 2.78e+06, 7.74e+11, 2.15e+17, 5.99e+22,
        #> 1.67e+28, 4.64e+33, 1.29e+39, 3.59e+44, 1.00e+50])

        初始化數(shù)組的元素全為1或全為0。

        np.zeros([2,2])
        #> array([[ 0., 0.],
        #> [ 0., 0.]])
        np.ones([2,2])
        #> array([[ 1., 1.],
        #> [ 1., 1.]])

        7.1 如何構(gòu)建重復(fù)的序列數(shù)

        np.tile重復(fù)整個(gè)的數(shù)組或列表n次,np.repeat重復(fù)數(shù)組每一項(xiàng)n次。

        a = [1,2,3] 

        # 重復(fù)數(shù)組a兩次
        print('Tile: ', np.tile(a, 2))

        # 重復(fù)數(shù)組a每項(xiàng)兩次
        print('Repeat: ', np.repeat(a, 2))

        #> Tile: [1 2 3 1 2 3]
        #> Repeat: [1 1 2 2 3 3]

        7.2 如何生存隨機(jī)數(shù)

        random模塊包含的函數(shù)可以生成任一數(shù)組形狀的隨機(jī)數(shù)和統(tǒng)計(jì)分布。

        # 生成2行2列的[0,1)的隨機(jī)數(shù)
        print(np.random.rand(2,2))

        # 生成均值為0方差為1的2行2列的正態(tài)分布值
        print(np.random.randn(2,2))

        # 生成[0,10)的2行2列的隨機(jī)整數(shù)
        print(np.random.randint(0, 10, size=[2,2]))

        # 生成一個(gè)[0,1)的隨機(jī)數(shù)
        print(np.random.random())

        # 生成[0,1)的2行2列的隨機(jī)數(shù)
        print(np.random.random(size=[2,2]))

        # 從給定的列表等概率抽樣10次
        print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10))

        # 從給定的列表和對(duì)應(yīng)的概率分布抽樣10次
        print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10, p=[0.3, .1, 0.1, 0.4, 0.1])) # picks more o's

        #> [[ 0.84 0.7 ]
        #> [ 0.52 0.8 ]]

        #> [[-0.06 -1.55]
        #> [ 0.47 -0.04]]

        #> [[4 0]
        #> [8 7]]

        #> 0.08737272424956832

        #> [[ 0.45 0.78]
        #> [ 0.03 0.74]]

        #> ['i' 'a' 'e' 'e' 'a' 'u' 'o' 'e' 'i' 'u']
        #> ['o' 'a' 'e' 'a' 'a' 'o' 'o' 'o' 'a' 'o']

        7.3 如何得到數(shù)組獨(dú)特(unique)的項(xiàng)和個(gè)數(shù)(counts)

        np.unique函數(shù)去除數(shù)組中重復(fù)的元素,設(shè)置return_counts參數(shù)為True,得到數(shù)組每一項(xiàng)的個(gè)數(shù)。

        # 定義范圍為[0,10),個(gè)數(shù)為10的隨機(jī)整數(shù)數(shù)組
        np.random.seed(100)
        arr_rand = np.random.randint(0, 10, size=10)
        print(arr_rand)

        #> [8 8 3 7 7 0 4 2 5 2]
        # 得到數(shù)組獨(dú)特的項(xiàng)和相應(yīng)的個(gè)數(shù)
        uniqs, counts = np.unique(arr_rand, return_counts=True)
        print("Unique items : ", uniqs)
        print("Counts : ", counts)

        #> Unique items : [0 2 3 4 5 7 8]
        #> Counts : [1 2 1 1 1 2 2]
        8 小結(jié)



        本文比較全面的介紹了numpy的基本用法,希望對(duì)numpy還不熟悉的同學(xué)有所幫助。



        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


        瀏覽 38
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            裸体欧美军警猛男gay | 30分钟无遮挡高清视频 | 91精品国产熟女 | 天天色偷偷 | 无码18p | 丰满少妇被猛烈进入在线观看 | 欧美日韩国产无码 | 大香蕉伊人影视 | 中文字幕AV第一页 | 超碰国产在线观看 |