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

首頁 > 編程 > Python > 正文

深入理解NumPy簡明教程---數組3(組合)

2019-11-25 16:26:48
字體:
來源:轉載
供稿:網友

前兩篇文章對NumPy數組做了基本的介紹,本篇文章對NumPy數組進行較深入的探討。首先介紹自定義類型的數組,接著數組的組合,最后介紹數組復制方面的問題。

自定義結構數組

通過NumPy也可以定義像C語言那樣的結構類型。在NumPy中定義結構的方法如下:

定義結構類型名稱;定義字段名稱,標明字段數據類型。

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

這里student是自定義結構類型的名稱,使用dtype函數創建,在第一個參數中,'names'和'formats'不能改變,names中列出的是結構中字段名稱,formats中列出的是對應字段的數據類型。S32表示32字節長度的字符串,i表示32位的整數,f表示32位長度的浮點數。最后一個參數為True時,表示要求進行內存對齊。

字段中使用NumPy的字符編碼來表示數據類型。更詳細的數據類型見下表。

數據類型 字符編碼
整數 i
無符號整數 u
單精度浮點數 f
雙精度浮點數 d
布爾值 b
復數 D
字符串 S
Unicode U
Void V

在定義好結構類型之后,就可以定義以該類型為元素的數組了:

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

除了在每個元素中依次列出對應字段的數據外,還需要在array函數中最后一個參數指定其所對應的數據類型。

注:例子來源于張若愚的Python科學計算藝術的29頁。更多關于dtype的內容請參考《NumPy for Beginner》一書的第二章。

組合函數

這里介紹以不同的方式組合函數。首先創建兩個數組:

>>> 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]]) 

水平組合

>>> hstack((a, b)) array([[ 0, 1, 2, 0, 2, 4],   [ 3, 4, 5, 6, 8, 10],   [ 6, 7, 8, 12, 14, 16]]) 

也可通過concatenate函數并指定相應的軸來獲得這一效果:

>>> concatenate((a, b), axis=1) array([[ 0, 1, 2, 0, 2, 4],   [ 3, 4, 5, 6, 8, 10],   [ 6, 7, 8, 12, 14, 16]]) 

垂直組合

>>> vstack((a, b)) array([[ 0, 1, 2],   [ 3, 4, 5],   [ 6, 7, 8],   [ 0, 2, 4],   [ 6, 8, 10],   [12, 14, 16]]) 

同樣,可通過concatenate函數,并指定相應的軸來獲得這一效果。

>>> concatenate((a, b), axis=0) array([[ 0, 1, 2],   [ 3, 4, 5],   [ 6, 7, 8],   [ 0, 2, 4],   [ 6, 8, 10],   [12, 14, 16]]) 

深度組合

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

>>> dstack((a, b)) array([[[ 0, 0],   [ 1, 2],   [ 2, 4]],    [[ 3, 6],   [ 4, 8],   [ 5, 10]],    [[ 6, 12],   [ 7, 14],   [ 8, 16]]]) 

仔細觀察,發現對應的元素都組合成一個新的列表,該列表作為新的數組的元素。

行組合

行組合可將多個一維數組作為新數組的每一行進行組合:

>>> one = arange(2) >>> one array([0, 1]) >>> two = one + 2 >>> two array([2, 3]) >>> row_stack((one, two)) array([[0, 1],   [2, 3]]) 

對于2維數組,其作用就像垂直組合一樣。

列組合

列組合的效果應該很清楚了。如下:

>>> column_stack((oned, twiceoned)) array([[0, 2],   [1, 3]]) 

對于2維數組,其作用就像水平組合一樣。

分割數組

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

水平分割

>>> 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]])] 

也調用split函數并指定軸為1來獲得這樣的效果:

split(a, 3, axis=1) 

垂直分割

垂直分割是沿著垂直的軸切分數組:

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

同樣,也可通過solit函數并指定軸為1來獲得這樣的效果:

>>> split(a, 3, axis=0) 

面向深度的分割

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

>>> 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]]])] 

復制和鏡像(View)

當運算和處理數組時,它們的數據有時被拷貝到新的數組有時不是。這通常是新手的困惑之源。這有三種情況:

完全不復制

簡單的賦值,而不復制數組對象或它們的數據。

>>> a = arange(12) >>> b = a  #不創建新對象 >>> b is a   # a和b是同一個數組對象的兩個名字 True >>> b.shape = 3,4 #也改變了a的形狀 >>> a.shape (3, 4)     Python 傳遞不定對象作為參考4,所以函數調用不拷貝數組。 >>> def f(x): ...  print id(x) ... >>> id(a)  #id是一個對象的唯一標識 148293216 >>> f(a) 148293216 

視圖(view)和淺復制

不同的數組對象分享同一個數據。視圖方法創造一個新的數組對象指向同一數據。

>>> c = a.view() >>> c is a False >>> c.base is a  #c是a持有數據的鏡像 True >>> c.flags.owndata False >>> >>> c.shape = 2,6 # a的形狀沒變 >>> a.shape (3, 4) >>> c[0,4] = 1234  #a的數據改變了 >>> a array([[ 0, 1, 2, 3],   [1234, 5, 6, 7],   [ 8, 9, 10, 11]]) 

切片數組返回它的一個視圖:

>>> s = a[ : , 1:3]  # 獲得每一行1,2處的元素 >>> s[:] = 10   # s[:] 是s的鏡像。注意區別s=10 and s[:]=10 >>> a array([[ 0, 10, 10, 3],   [1234, 10, 10, 7],   [ 8, 10, 10, 11]]) 

深復制

這個復制方法完全復制數組和它的數據。

 >>> d = a.copy()  #創建了一個含有新數據的新數組對象 >>> d is a False >>> d.base is a  #d和a現在沒有任何關系 False >>> d[0,0] = 9999 >>> a array([[ 0, 10, 10, 3],   [1234, 10, 10, 7],   [ 8, 10, 10, 11]]) 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿鲁科尔沁旗| 宁都县| 祁阳县| 图片| 清丰县| 永平县| 来凤县| 莫力| 泰和县| 神农架林区| 寿宁县| 天峻县| 滦南县| 阜康市| 昌邑市| 禄丰县| 曲靖市| 彭山县| 文登市| 莆田市| 定日县| 丹寨县| 彭泽县| 都兰县| 新晃| 武夷山市| 安远县| 常熟市| 来安县| 威远县| 揭阳市| 永昌县| 曲麻莱县| 达拉特旗| 巍山| 景东| 中江县| 呼和浩特市| 庆阳市| 嘉定区| 东莞市|