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數(shù)組的方法

        共 5403字,需瀏覽 11分鐘

         ·

        2022-01-05 12:28


        說在前面

        numpy數(shù)組的強(qiáng)大之處在于它可以對(duì)數(shù)組進(jìn)行整體操作,代碼簡(jiǎn)明,執(zhí)行速度快。下面我們就來看看整體操作numpy數(shù)組的一些常用方法和經(jīng)典案例。

        ?bae72b5a77eb345a369b3a6198334b1f.webp


        1.? numpy數(shù)組與標(biāo)量的運(yùn)算

        numpy數(shù)組支持與標(biāo)量的加、減、乘、除和冪等算術(shù)運(yùn)算,計(jì)算結(jié)果為一個(gè)新數(shù)組,其元素為標(biāo)量與原數(shù)組每個(gè)元素進(jìn)行計(jì)算的結(jié)果。演示代碼如下:

        >>> a = np.arange(8)>>> a.shape = (2, 4) #修改數(shù)組形狀為2行4列>>> aarray([[0, 1, 2, 3],       [4, 5, 6,7]])>>> a + 2array([[2, 3, 4, 5],       [6, 7, 8,9]])>>> a - 2array([[-2, -1, 0,  1],       [ 2,  3, 4,  5]])>>> a * 2array([[ 0, 2,  4,  6],       [ 8, 10,12, 14]])>>> a / 2array([[0. , 0.5, 1. , 1.5],       [2. ,2.5, 3. , 3.5]])>>> a // 2array([[0, 0, 1, 1],       [2, 2, 3,3]], dtype=int32)>>> a % 2array([[0, 1, 0, 1],       [0, 1, 0,1]], dtype=int32)>>> a ** 2 #分別計(jì)算0**2,1**2,2**2,…,7**2array([[ 0, 1,  4,  9],       [16, 25,36, 49]], dtype=int32)>>> 2 ** a #分別計(jì)算2**0,2**1,2**2,…,2**7array([[ 1,   2,   4,  8],       [16,  32, 64, 128]], dtype=int32)
        2.????? numpy 數(shù)學(xué)函數(shù)和算術(shù)函數(shù)

        numpy 包含大量的各種數(shù)學(xué)運(yùn)算的函數(shù),包括三角函數(shù),算術(shù)運(yùn)算的函數(shù),復(fù)數(shù)處理函數(shù)等。

        numpy 提供了標(biāo)準(zhǔn)的三角函數(shù):sin()、cos()、tan()。arcsin()、arccos()arctan()函數(shù)返回給定角度的 sin,cos tan 的反三角函數(shù)。這些函數(shù)的結(jié)果可以通過 numpy.degrees() 函數(shù)將弧度轉(zhuǎn)換為角度。

        numpy.abs() 函數(shù)返回各元素的絕對(duì)值。

        numpy.around() 函數(shù)返回指定數(shù)字的四舍五入值。

        numpy.floor()函數(shù)返回小于或者等于指定表達(dá)式的最大整數(shù),即向下取整。

        numpy.ceil()函數(shù)返回大于或者等于指定表達(dá)式的最小整數(shù),即向上取整。

        numpy.reciprocal()函數(shù)返回各元素的倒數(shù),如1/4 倒數(shù)為 4/1。

        3. numpy數(shù)組與數(shù)組的運(yùn)算

        (1)形狀相同的數(shù)組進(jìn)行算術(shù)運(yùn)算。

        可以對(duì)兩個(gè)形狀相同的numpy數(shù)組進(jìn)行算術(shù)運(yùn)算,得到一個(gè)新數(shù)組,其元素的值為原來的兩個(gè)數(shù)組中對(duì)應(yīng)位置上元素進(jìn)行運(yùn)算的結(jié)果。演示代碼如下:

        >>> a =np.array([[1,3,5,7,9],[2,4,6,8,10]])>>> aarray([[ 1,  3, 5,  7,  9],      [ 2,  4,  6,  8,10]])>>> b =  np.array([[1,2,3,4,5],[10,9,8,7,6]])>>> barray([[ 1,  2, 3,  4,  5],      [10,  9,  8, 7,  6]])>>> a + barray([[ 2,  5,  8,11, 14],      [12, 13, 14, 15, 16]])>>> a - barray([[ 0,  1, 2,  3,  4],      [-8, -5, -2,  1,  4]])>>> a * barray([[ 1,  6, 15, 28, 45],      [20, 36, 48, 56, 60]])>>> a / barray([[1.        , 1.5       , 1.66666667, 1.75      , 1.8       ],      [0.2       , 0.44444444, 0.75      , 1.14285714, 1.66666667]])>>> a % barray([[0, 1, 2, 3, 4],      [2, 4, 6, 1, 4]], dtype=int32)>>> a ** barray([[      1,      9,     125,    2401,  59049],      [   1024,  262144, 1679616, 2097152, 1000000]],dtype=int32)

        (2)numpy數(shù)組廣播機(jī)制。

        當(dāng)運(yùn)算中的 2個(gè)數(shù)組的形狀不同時(shí),numpy將自動(dòng)觸發(fā)廣播機(jī)制。演示代碼如下:

        >>> a = np.array([[ 0, 0,0],[10,10,10],[20,20,20],[30,30,30]])>>> b = np.array([1,2,3])>>> a + barray([[ 1, 2,  3],       [11, 12,13],       [21, 22,23],       [31, 32,33]])


        圖1-2展示了數(shù)組b如何通過廣播來與數(shù)組a兼容。

        237185997f63240f57ebc5d64596df15.webp

        圖1-2

        注意:若想要兩個(gè)數(shù)組通過廣播機(jī)制來實(shí)現(xiàn)兼容,則其中某個(gè)數(shù)組的維度必須為1(即只有1行或1列);若條件不滿足,則拋出異常。演示代碼如下:

        >>> a =np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])>>> b = np.array([[1],[2],[3],[4]])>>> a + barray([[ 2, 3,  4,  5],       [ 7,  8,  9,10],       [12, 13,14, 15],       [17, 18,19, 20]])>>> c = np.array([[1, 2],[3, 4]])>>> a + cTraceback (most recent call last):  File"", line 1, in <module>    a + cValueError:?operands?could?not?be?broadcast?togetherwith?shapes?(4,4)?(2,2)


        (3)連接數(shù)組。

        concatenate()函數(shù)用于沿指定軸連接相同維度的兩個(gè)或多個(gè)數(shù)組,函數(shù)格式如下:

        np. concatenate((a1, a2, ...), axis=0)

        其中a1, a2, ...表示多個(gè)相同維度的數(shù)組;axis表示沿著它連接數(shù)組的軸,值為0時(shí)增加行數(shù),值為1時(shí)增加列數(shù)。演示代碼如下:

        >>> a = np.array([[1,2],[3,4],[5,6]])>>> aarray([[1, 2],       [3, 4],       [5, 6]])>>> b = np.array([[4, 5],[6,7]])>>> barray([[4, 5],       [6, 7]])>>> np.concatenate((a,b),axis=0) #沿軸0連接兩個(gè)數(shù)組,要確保列數(shù)相同array([[1, 2],       [3, 4],       [5, 6],       [4, 5],       [6, 7]])>>> c = np.array([[1],[2],[3]])>>> carray([[1],       [2],       [3]])>>> np.concatenate((a,c),axis=1) #沿軸1連接兩個(gè)數(shù)組,要確保行數(shù)相同array([[1, 2, 1],       [3, 4,2],       [5, 6,3]])


        4. ?numpy數(shù)組條件篩選函數(shù)

        (1)where()函數(shù)

        與使用布爾索引訪問數(shù)組類似,numpy模塊提供了where()函數(shù)來返回?cái)?shù)組中滿足條件的索引數(shù)組,或根據(jù)數(shù)組中的元素是否滿足指定條件來決定取值x還是y,其語法格式如下:

        numpy.where(condition[,x,y])

        該函數(shù)有一個(gè)必選參數(shù)condition,通過判斷原數(shù)組的每個(gè)元素是否滿足條件,返回一個(gè)由滿足條件的元素的索引構(gòu)成的數(shù)組;x,y是可選參數(shù),如果條件為真,則返回x,否則返回y。

        如果只有一個(gè)condition參數(shù),則該函數(shù)返回索引數(shù)組,或者是由索引數(shù)組構(gòu)成的元組(多維數(shù)組);如果是有三個(gè)參數(shù),則返回由x和y值構(gòu)成的數(shù)組。演示代碼如下:

        >>> a = np.arange(1, 11)>>> aarray([ 1,  2, 3,  4,  5, 6,  7,  8,  9,10])>>> np.where(a % 2 == 1)  #提供1個(gè)參數(shù),只返回滿足條件的索引數(shù)組(array([0, 2, 4, 6, 8], dtype=int64),)>>> a[np.where(a % 2 ==1)]  #使用索引重構(gòu)原數(shù)組array([1, 3, 5, 7, 9])>>> np.where(a % 2 == 1, 1,0)  #提供3個(gè)參數(shù),滿足條件取值1,否則取值0array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0])>>>a=np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]) #二維數(shù)組>>> aarray([[1, 2, 3, 4,5],       [2, 3, 4, 5, 6],       [3, 4, 5, 6, 7],       [4, 5, 6, 7, 8]])>>> i =np.where((a>4) & (a<7)) #提供1個(gè)參數(shù),只返回滿足條件的索引數(shù)組>>> i #因?yàn)閍是二維數(shù)組,故i為由索引數(shù)組構(gòu)成的元組,分別存儲(chǔ)了滿足條件的數(shù)組元素的行索引和列索引(array([0, 1, 1, 2,2, 3, 3], dtype=int64), array([4, 3, 4, 2, 3, 1, 2], dtype=int64))>>> a[i] #使用索引重構(gòu)原數(shù)組,相當(dāng)于使用整數(shù)數(shù)組索引訪問數(shù)組array([5, 5, 6, 5,6, 5, 6])>>> a[[0,1, 1, 2, 2, 3, 3],[4, 3, 4, 2, 3, 1, 2]] #使用整數(shù)數(shù)組索引訪問數(shù)組array([5, 5, 6, 5,6, 5, 6])>>> np.where(a % 2 == 1, 1, 0)#提供3個(gè)參數(shù),滿足條件取值1,否則取值0array([[1, 0, 1, 0, 1],      [0, 1, 0, 1, 0],      [1, 0, 1, 0, 1],      [0, 1, 0, 1, 0]])>>> np.where(a % 2 == 1, a*2, a//2) #提供3個(gè)參數(shù),奇數(shù)翻倍,偶數(shù)減半array([[ 2, 1,  6,  2, 10],       [ 1,  6,  2,10,  3],       [ 6,  2, 10, 3, 14],       [ 2,10,  3, 14,  4]])


        2piecewise()函數(shù)

        piecewise()函數(shù)用來篩選滿足不同條件的元素,函數(shù)格式如下:

        np.piecewise(x, condlist, funclist,*args, **kw)

        關(guān)鍵參數(shù)說明:

        x表示要進(jìn)行操作的對(duì)象;condlist表示要滿足的條件列表,可以是多個(gè)條件構(gòu)成的列表;funclist是執(zhí)行的操作列表,它與參數(shù)condlist是對(duì)應(yīng)的,當(dāng)條件為True時(shí),則執(zhí)行相對(duì)應(yīng)的操作函數(shù)。返回一個(gè)array對(duì)象,和原始操作對(duì)象x具有完全相同的維度和形狀。

        例如,隨機(jī)生成一個(gè)numpy數(shù)組a存儲(chǔ)學(xué)生成績(jī),為學(xué)生設(shè)置1、2、3、4四個(gè)等級(jí);臨界分?jǐn)?shù)分別為60、80和90分。演示代碼如下:

        a = np.random.randint(0, 101, 6)print(a)b = np.piecewise(a,[a<60,((60<=a)&(a<80)),((80<=a)&(a<90)),a>=90],[1, 2,3, 4])print(b)


        5. 批量處理numpy數(shù)組案例分析

        (1)隨機(jī)生成一個(gè)二維numpy數(shù)組a,將數(shù)組中小于0的置零大于零的保留原值。

        參考代碼如下:

        a = np.random.randint(-10, 10, (2, 3)) #生成2行3列元素值介于[-10,10)的隨機(jī)整數(shù)print(a)#方法一:where()函數(shù)b = np.where(a>0, a, 0)print(b)#方法二:abs()函數(shù)b = (a + np.abs(a)) // 2print(b)#方法三:布爾索引a[a<0] = 0print(a)


        (2)隨機(jī)生成一個(gè)二維numpy數(shù)組a,對(duì)數(shù)組元素做y=2*x*x-3*x+5的運(yùn)算(連續(xù)函數(shù))。

        參考代碼如下:

        a = np.random.randint(-10, 10, (2, 3)) #生成23列元素值介于[-10,10)的隨機(jī)整數(shù)print(a)def fun(x): #連續(xù)函數(shù)    return2*x*x-3*x+5b = fun(a)print(b)


        (3)隨機(jī)生成一個(gè)二維numpy數(shù)組a,對(duì)數(shù)組元素做y=4*x-3(x>0),y=2*x+6(x<=0)的運(yùn)算(非連續(xù)函數(shù))。

        參考代碼如下:

        a = np.random.randint(-10, 10, (2, 3)) #生成2行3列元素值介于[-10,10)的隨機(jī)整數(shù)print(a)def fun2(x): #非連續(xù)函數(shù)    if x > 0:        y =4*x-3    else:        y = 2*x+6    return yfun_vec = np.vectorize(fun2) #先對(duì)fun2進(jìn)行向量化處理b = fun_vec(a) #再調(diào)用向量化處理過的函數(shù)print(b)


        (4)從存儲(chǔ)身份證號(hào)碼的數(shù)組中提取出生日期信息。

        參考代碼如下:

        a = ["330281200409172215","522424200405202975","610528200409070018"]a = np.array(a)def fun3(x): #非連續(xù)函數(shù)    returnx[6:14]fun_vec = np.vectorize(fun3) #先對(duì)fun3進(jìn)行向量化處理b = fun_vec(a) #再調(diào)用向量化處理過的函數(shù)print(b)


        (5)隨機(jī)生成一個(gè)numpy數(shù)組a,返回其對(duì)應(yīng)的二進(jìn)制數(shù)(非連續(xù)函數(shù))。

        參考代碼如下:

        a = np.random.randint(-10, 10, 3)print(a)def fun4(x): #非連續(xù)函數(shù)    returnbin(x)fun_vec = np.vectorize(fun4) #先對(duì)fun4進(jìn)行向量化處理b = fun_vec(a) #再調(diào)用向量化處理過的函數(shù)print(b)


        (6)隨機(jī)生成2個(gè)numpy數(shù)組a和b,若a>b,返回a-b;否則返回b-a(非連續(xù)函數(shù))。

        參考代碼如下:

        a = np.random.randint(-10, 10, 3)b = np.random.randint(-10, 10, 3)print(a, b)def fun5(a, b): #非連續(xù)函數(shù)    if a > b:        return a- b    else:        return b- afun_vec = np.vectorize(fun5) #先對(duì)fun5進(jìn)行向量化處理c = fun_vec(a, b) #再調(diào)用向量化處理過的函數(shù)print(c)


        知識(shí)小貼士

        vectorize()函數(shù)用來將函數(shù)向量化處理,以便可以批量處理numpy數(shù)組的每一個(gè)元素,其具體參數(shù)如下:

        numpy.vectorize(pyfunc, otypes=None, doc=None,excluded=None, cache=False, signature=None)

        pyfunc : python函數(shù)或方法。

        otypes : 輸出數(shù)據(jù)類型。必須將其指定為一個(gè)typecode字符串或一個(gè)數(shù)據(jù)類型說明符列表。每個(gè)輸出應(yīng)該有一個(gè)數(shù)據(jù)類型說明符。

        doc : 函數(shù)的docstring。如果為None,則docstring將是pyfunc.__doc__。

        excluded : 表示函數(shù)不會(huì)向量化的位置或關(guān)鍵字參數(shù)的字符串或整數(shù)集。這些將直接傳遞給未經(jīng)修改的pyfunc。

        cache :如果為True,則緩存第一個(gè)函數(shù)調(diào)用,該函數(shù)調(diào)用確定未提供otype的輸出數(shù)。

        signature : 廣義通用函數(shù)簽名,例如,(m,n),(n)->(m)用于矢量化矩陣 - 向量乘法。如果提供的話,pyfunc將調(diào)用(并期望返回)具有由相應(yīng)核心維度的大小給出的形狀的數(shù)組。默認(rèn)情況下,pyfunc假定將標(biāo)量作為輸入和輸出。

        函數(shù)返回值:向量化的數(shù)組。


        需要本文源代碼和word文稿的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。

        我們專注Python算法,感興趣就一起來!



        相關(guān)優(yōu)秀文章:

        閱讀代碼和寫更好的代碼

        最有效的學(xué)習(xí)方式

        利用pandas模塊處理學(xué)生成績(jī)

        利用pandas模塊處理百家姓數(shù)據(jù)


        瀏覽 100
        點(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>
            日产又大又黄又爽又猛 | AV豆花 | 91短视频在线观看视频 | 国语自产免费精品视频在 | 制服丝袜中文字幕第一页 | 好大好爽快点深一点图片 | 91视频国产免费 | 欧美三级美国一级 | 日本黄色电影网站 | 欧美日韩人妻精品 |