深入理解NumPy簡(jiǎn)明教程---數(shù)組3(組合)
前兩篇文章對(duì)NumPy數(shù)組做了基本的介紹,本篇文章對(duì)NumPy數(shù)組進(jìn)行較深入的探討。首先介紹自定義類型的數(shù)組,接著數(shù)組的組合,最后介紹數(shù)組復(fù)制方面的問題。
自定義結(jié)構(gòu)數(shù)組
通過NumPy也可以定義像C語言那樣的結(jié)構(gòu)類型。在NumPy中定義結(jié)構(gòu)的方法如下:
定義結(jié)構(gòu)類型名稱;定義字段名稱,標(biāo)明字段數(shù)據(jù)類型。
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的字符編碼來表示數(shù)據(jù)類型。更詳細(xì)的數(shù)據(jù)類型見下表。
數(shù)據(jù)類型 | 字符編碼 |
整數(shù) | i |
無符號(hào)整數(shù) | u |
單精度浮點(diǎn)數(shù) | f |
雙精度浮點(diǎn)數(shù) | d |
布爾值 | b |
復(fù)數(shù) | D |
字符串 | S |
Unicode | U |
Void | V |
在定義好結(jié)構(gòu)類型之后,就可以定義以該類型為元素的數(shù)組了:
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ù)類型。
注:例子來源于張若愚的Python科學(xué)計(jì)算藝術(shù)的29頁。更多關(guān)于dtype的內(nèi)容請(qǐng)參考《NumPy for Beginner》一書的第二章。
組合函數(shù)
這里介紹以不同的方式組合函數(shù)。首先創(chuàng)建兩個(gè)數(shù)組:
>>> 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函數(shù)并指定相應(yīng)的軸來獲得這一效果:
>>> 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函數(shù),并指定相應(yīng)的軸來獲得這一效果。
>>> 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è)軸(即深度)上組合。如下:
>>> 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)行組合:
>>> 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)該很清楚了。如下:
>>> column_stack((oned, twiceoned)) array([[0, 2], [1, 3]])
對(duì)于2維數(shù)組,其作用就像水平組合一樣。
分割數(shù)組
在NumPy中,分割數(shù)組的函數(shù)有hsplit、vsplit、dsplit和split??蓪?shù)組分割成相同大小的子數(shù)組,或指定原數(shù)組分割的位置。
水平分割
>>> 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來獲得這樣的效果:
split(a, 3, axis=1)
垂直分割
垂直分割是沿著垂直的軸切分?jǐn)?shù)組:
>>> vsplit(a, 3) >>> [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
同樣,也可通過solit函數(shù)并指定軸為1來獲得這樣的效果:
>>> split(a, 3, axis=0)
面向深度的分割
dsplit函數(shù)使用的是面向深度的分割方式:
>>> 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ù)。
>>> 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ù)組。 >>> 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ù)。
>>> 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的形狀沒變 >>> 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è)視圖:
>>> 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ù)。
>>> d = a.copy() #創(chuàng)建了一個(gè)含有新數(shù)據(jù)的新數(shù)組對(duì)象 >>> d is a False >>> d.base is a #d和a現(xiàn)在沒有任何關(guān)系 False >>> d[0,0] = 9999 >>> a array([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01使用Python實(shí)現(xiàn)Excel文件轉(zhuǎn)換為SVG格式
SVG(Scalable Vector Graphics)是一種基于XML的矢量圖像格式,這種格式在Web開發(fā)和其他圖形應(yīng)用中非常流行,提供了一種高效的方式來呈現(xiàn)復(fù)雜的矢量圖形,本文將介紹如何使用Python轉(zhuǎn)換Excel文件為SVG格式,需要的朋友可以參考下2024-07-07Python實(shí)現(xiàn)圖形用戶界面和游戲開發(fā)的方法和技巧
GUI圖形用戶界面編程,我們可以通過python提供的豐富的組件,快速的實(shí)現(xiàn)使用圖形的界面和用戶交互, GUI編程類似于“搭積?”,將?個(gè)個(gè)組件(Widget)放到窗?中,這篇文章主要給大家介紹了基于Python的GUI圖形用戶界面編程的相關(guān)資料,需要的朋友可以參考下2023-05-05Python使用pymssql連接SQL?SEVER數(shù)據(jù)庫全流程
SQL Server是微軟推出的重量級(jí)的數(shù)據(jù)庫,目前有多個(gè)版本,如2000、2008、2012等,下面這篇文章主要給大家介紹了關(guān)于Python使用pymssql連接SQL?SEVER數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-12-12python+selenium+Chrome options參數(shù)的使用
這篇文章主要介紹了python+selenium+Chrome options參數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python利用Bokeh進(jìn)行數(shù)據(jù)可視化的教程分享
Bokeh是Python中的數(shù)據(jù)可視化庫,提供高性能的交互式圖表和繪圖。本文將利用Bokeh繪制一些可視化圖表,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08