国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

NumPy簡(jiǎn)明教程(二、數(shù)組3)

2019-11-09 19:15:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前兩篇文章對(duì)NumPy數(shù)組做了基本的介紹,本篇文章對(duì)NumPy數(shù)組進(jìn)行較深入的探討。首先介紹自定義類型的數(shù)組,接著數(shù)組的組合,最后介紹數(shù)組復(fù)制方面的問(wèn)題。

自定義結(jié)構(gòu)數(shù)組

通過(guò)NumPy也可以定義像C語(yǔ)言那樣的結(jié)構(gòu)類型。在NumPy中定義結(jié)構(gòu)的方法如下:

定義結(jié)構(gòu)類型名稱;定義字段名稱,標(biāo)明字段數(shù)據(jù)類型。

[python] view plain copy student= dtype({'names':['name', 'age', 'weight'], 'formats':['S32', 'i','f']}, align = True)  

這里student是自定義結(jié)構(gòu)類型的名稱,使用dtype函數(shù)創(chuàng)建,在第一個(gè)參數(shù)中,'names'和'formats'不能改變,names中列出的是結(jié)構(gòu)中字段名稱,formats中列出的是對(duì)應(yīng)字段的數(shù)據(jù)類型。S32表示32字節(jié)長(zhǎng)度的字符串,i表示32位的整數(shù),f表示32位長(zhǎng)度的浮點(diǎn)數(shù)。最后一個(gè)參數(shù)為True時(shí),表示要求進(jìn)行內(nèi)存對(duì)齊。

字段中使用NumPy的字符編碼來(lái)表示數(shù)據(jù)類型。更詳細(xì)的數(shù)據(jù)類型見(jiàn)下表。

數(shù)據(jù)類型字符編碼
整數(shù)i
無(wú)符號(hào)整數(shù)u
單精度浮點(diǎn)數(shù)f
雙精度浮點(diǎn)數(shù)d
布爾值b
復(fù)數(shù)D
字符串S
UnicodeU
VoidV
在定義好結(jié)構(gòu)類型之后,就可以定義以該類型為元素的數(shù)組了:

[python] view plain copy a= array([(“Zhang”, 32, 65.5), (“Wang”, 24, 55.2)], dtype =student)  

除了在每個(gè)元素中依次列出對(duì)應(yīng)字段的數(shù)據(jù)外,還需要在array函數(shù)中最后一個(gè)參數(shù)指定其所對(duì)應(yīng)的數(shù)據(jù)類型。

注:例子來(lái)源于張若愚的Python科學(xué)計(jì)算藝術(shù)的29頁(yè)。更多關(guān)于dtype的內(nèi)容請(qǐng)參考《NumPy for Beginner》一書的第二章。

組合函數(shù)

這里介紹以不同的方式組合函數(shù)。首先創(chuàng)建兩個(gè)數(shù)組:

[python] view plain copy >>> a = arange(9).reshape(3,3)  >>> a  array([[0, 1, 2],             [3, 4, 5],             [6, 7, 8]])  >>> b = 2 * a  >>> b  array([[ 0, 2, 4],         [ 6, 8, 10],         [12, 14, 16]])  

水平組合

[python] view plain copy >>> hstack((a, b))  array([[ 0, 1, 2, 0, 2, 4],         [ 3, 4, 5, 6, 8, 10],         [ 6, 7, 8, 12, 14, 16]])  也可通過(guò)concatenate函數(shù)并指定相應(yīng)的軸來(lái)獲得這一效果:[python] view plain copy >>> concatenate((a, b), axis=1)  array([[ 0, 1, 2, 0, 2, 4],         [ 3, 4, 5, 6, 8, 10],         [ 6, 7, 8, 12, 14, 16]])  

垂直組合

[python] view plain copy >>> vstack((a, b))  array([[ 0, 1, 2],         [ 3, 4, 5],         [ 6, 7, 8],          [ 0, 2, 4],         [ 6, 8, 10],         [12, 14, 16]])  同樣,可通過(guò)concatenate函數(shù),并指定相應(yīng)的軸來(lái)獲得這一效果。[python] view plain copy >>> concatenate((a, b), axis=0)  array([[ 0, 1, 2],         [ 3, 4, 5],         [ 6, 7, 8],         [ 0, 2, 4],         [ 6, 8, 10],         [12, 14, 16]])  

深度組合

另外,還有深度方面的組合函數(shù)dstack。顧名思義,就是在數(shù)組的第三個(gè)軸(即深度)上組合。如下:

[python] view plain copy >>> dstack((a, b))  array([[[ 0, 0],          [ 1, 2],          [ 2, 4]],           [[ 3, 6],          [ 4, 8],          [ 5, 10]],           [[ 6, 12],          [ 7, 14],          [ 8, 16]]])  仔細(xì)觀察,發(fā)現(xiàn)對(duì)應(yīng)的元素都組合成一個(gè)新的列表,該列表作為新的數(shù)組的元素。

行組合

行組合可將多個(gè)一維數(shù)組作為新數(shù)組的每一行進(jìn)行組合:

[python] view plain copy >>> one = arange(2)  >>> one  array([0, 1])  >>> two = one + 2  >>> two  array([2, 3])  >>> row_stack((one, two))  array([[0, 1],         [2, 3]])  對(duì)于2維數(shù)組,其作用就像垂直組合一樣。

列組合

列組合的效果應(yīng)該很清楚了。如下:

[python] view plain copy >>> column_stack((oned, twiceoned))  array([[0, 2],         [1, 3]])  對(duì)于2維數(shù)組,其作用就像水平組合一樣。

分割數(shù)組

在NumPy中,分割數(shù)組的函數(shù)有hsplit、vsplit、dsplit和split。可將數(shù)組分割成相同大小的子數(shù)組,或指定原數(shù)組分割的位置。

水平分割

[python] view plain copy >>> a = arange(9).reshape(3,3)  >>> a  array([[0, 1, 2],         [3, 4, 5],         [6, 7, 8]])  >>> hsplit(a, 3)  [array([[0],         [3],         [6]]),   array([[1],         [4],         [7]]),   array([[2],         [5],         [8]])]  也調(diào)用split函數(shù)并指定軸為1來(lái)獲得這樣的效果:[python] view plain copy split(a, 3, axis=1)  

垂直分割

垂直分割是沿著垂直的軸切分?jǐn)?shù)組:

[python] view plain copy >>> vsplit(a, 3)  >>> [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]  同樣,也可通過(guò)solit函數(shù)并指定軸為1來(lái)獲得這樣的效果:[python] view plain copy >>> split(a, 3, axis=0)  

面向深度的分割

dsplit函數(shù)使用的是面向深度的分割方式:

[python] view plain copy >>> c = arange(27).reshape(3, 3, 3)  >>> c  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],          [24, 25, 26]]])  >>> dsplit(c, 3)  [array([[[ 0],          [ 3],          [ 6]],           [[ 9],          [12],          [15]],           [[18],          [21],          [24]]]),   array([[[ 1],          [ 4],          [ 7]],           [[10],          [13],          [16]],           [[19],          [22],          [25]]]),   array([[[ 2],          [ 5],          [ 8]],           [[11],          [14],          [17]],           [[20],          [23],          [26]]])]  

復(fù)制和鏡像(View)

   當(dāng)運(yùn)算和處理數(shù)組時(shí),它們的數(shù)據(jù)有時(shí)被拷貝到新的數(shù)組有時(shí)不是。這通常是新手的困惑之源。這有三種情況:

完全不復(fù)制

   簡(jiǎn)單的賦值,而不復(fù)制數(shù)組對(duì)象或它們的數(shù)據(jù)。

[python] view plain copy >>> a = arange(12)  >>> b = a      #不創(chuàng)建新對(duì)象  >>> b is a           # a和b是同一個(gè)數(shù)組對(duì)象的兩個(gè)名字  True  >>> b.shape = 3,4    #也改變了a的形狀  >>> a.shape  (3, 4)  

    Python 傳遞不定對(duì)象作為參考4,所以函數(shù)調(diào)用不拷貝數(shù)組。

[python] view plain copy >>> def f(x):  ...     PRint id(x)  ...  >>> id(a)       #id是一個(gè)對(duì)象的唯一標(biāo)識(shí)  148293216  >>> f(a)  148293216  

視圖(view)和淺復(fù)制

   不同的數(shù)組對(duì)象分享同一個(gè)數(shù)據(jù)。視圖方法創(chuàng)造一個(gè)新的數(shù)組對(duì)象指向同一數(shù)據(jù)。

[python] view plain copy >>> c = a.view()  >>> c is a  False  >>> c.base is a      #c是a持有數(shù)據(jù)的鏡像  True  >>> c.flags.owndata  False  >>>  >>> c.shape = 2,6    # a的形狀沒(méi)變  >>> a.shape  (3, 4)  >>> c[0,4] = 1234        #a的數(shù)據(jù)改變了  >>> a  array([[   0,    1,    2,    3],         [1234,    5,    6,    7],         [   8,    9,   10,   11]])  切片數(shù)組返回它的一個(gè)視圖:[python] view plain copy >>> s = a[ : , 1:3]     # 獲得每一行1,2處的元素  >>> s[:] = 10           # s[:] 是s的鏡像。注意區(qū)別s=10 and s[:]=10  >>> a  array([[   0,   10,   10,    3],         [1234,   10,   10,    7],         [   8,   10,   10,   11]])  

深復(fù)制

   這個(gè)復(fù)制方法完全復(fù)制數(shù)組和它的數(shù)據(jù)。

[python] view plain copy >>> d = a.copy()       #創(chuàng)建了一個(gè)含有新數(shù)據(jù)的新數(shù)組對(duì)象  >>> d is a  False  >>> d.base is a        #d和a現(xiàn)在沒(méi)有任何關(guān)系  False  >>> d[0,0] = 9999  >>> a  array([[   0,   10,   10,    3],         [1234,   10,   10,    7],         [   8,   10,   10,   11]])  

參考文獻(xiàn):

《Python科學(xué)計(jì)算》《Tentative NumPy Tutorial》《NumPy for Beginner》


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 辽宁省| 昌都县| 宣城市| 洪江市| 新津县| 旬邑县| 讷河市| 周宁县| 尼勒克县| 梧州市| 平陆县| 蚌埠市| 馆陶县| 准格尔旗| 阳新县| 廉江市| 礼泉县| 浦江县| 宾阳县| 铅山县| 永济市| 连州市| 偏关县| 南丹县| 会泽县| 西青区| 长乐市| 故城县| 乌兰浩特市| 莱西市| 三门县| 游戏| 杭锦后旗| 北川| 五寨县| 青岛市| 浦江县| 丰顺县| 青神县| 天峻县| 乌拉特后旗|