python 二维数组长度_谈一谈多维数组
談
一
談
多
維
數(shù)
組
在各種語言中,都提供了多維數(shù)組。而多維數(shù)組又是很讓人迷惑的一個語法結(jié)構(gòu)。今天給大家聊一下多維數(shù)組使用中的一些問題。
這里,以Python和IDL為主講解。
多維數(shù)組的概念
首先說說多維數(shù)組的概念。多維數(shù)組在不同語言中有大同小異的語法定義,但是邏輯定義上基本上一致,就是同數(shù)據(jù)類型、同邏輯含義的數(shù)據(jù)單元構(gòu)成的能夠用整數(shù)為坐標(biāo)訪問的超立方體的數(shù)據(jù)集合。
這里我用的“超立方體”,指的是數(shù)據(jù)可以表達為多個維度的下標(biāo),例如線段、矩形、立方體……它們的反例就是所謂的“參差數(shù)組”,比如下面這樣的:
1, 2, 3, 4, 5
6, 7, 8
9, 1, 2, 3
這就是典型的一個參差數(shù)組,某一個維度的下標(biāo)范圍受到另外的維度的下標(biāo)取值影響。而超立方體呢,每個維度的下標(biāo)取值范圍(寬度)是固定的。這個情況在python的列表嵌套、C語言動態(tài)分配實現(xiàn)的多維數(shù)組中都會遇到。在某些特殊情況下確實有用,但是不在這里規(guī)范化的數(shù)組討論范圍內(nèi)。
第二個特點,同數(shù)據(jù)類型。正常情況下的數(shù)組都是由同類數(shù)據(jù)構(gòu)成的,但是也有例外,如python的列表(list)、元組(tuple)、字典(dict),javascript中的數(shù)組,這些都是允許元素類型隨意的。這種情況往往出現(xiàn)在腳本語言中,充分體現(xiàn)了語言的靈活性,但是這個真不是數(shù)組,后面會談到。
第三個特點,同數(shù)據(jù)含義。同樣的數(shù)據(jù)類型,不代表含義就相同,這個是做科學(xué)的人編程經(jīng)常犯的一個毛病。典型案例就是記錄數(shù)組。例如表達光譜,做一個3×n的數(shù)組,其中第一行代表波長,第二行代表流量,第三行代表誤差……從語法上來說,這沒錯,很多光譜也是這么發(fā)布的,但是從邏輯含義上來說,我更愿意把這個東西看做3個一維數(shù)組的強行拼湊,只是因為他們的數(shù)據(jù)類型都是浮點數(shù)而已。
多維數(shù)組 VS 記錄表
上面提到的最后一個情況,有些叫做二維表,我更愿意叫做記錄表,以區(qū)別于二維數(shù)組。除了上面的光譜,我再舉個例子:
RA | Dec | Mag_V |
06:54:15.29 | +56:52:09.4 | 16.65 |
22:09:38.91 | -03:51:48.1 | 13.25 |
這是天文上很常見的一張記錄表。這個表中,列數(shù)是固定的,每一列的含義也是獨立的、固定的,但是行是可以擴展的。在numpy中,這種數(shù)據(jù)用記錄(record)數(shù)組來表達,而IDL則使用結(jié)構(gòu)體(structure)數(shù)組。在各種語言中基本上也都是用記錄、結(jié)構(gòu)體、類/對象等等來表達的。在關(guān)系型數(shù)據(jù)庫中,這就是一個表。
記錄表和二維數(shù)組的相似性,有這么幾點:
① 都可以看做是二維的,有些語言中也確實當(dāng)做二維數(shù)組訪問;
② 如果各列的數(shù)據(jù)類型剛好一致(或者可以升級到相同類型),那么也可以用二維數(shù)組來裝;
但是它們有本質(zhì)的區(qū)別:
1,二維數(shù)組的下標(biāo)之間是等價的,例如表示一幅圖像時是x,y,表達矩陣是行列,可以轉(zhuǎn)置、翻轉(zhuǎn),不影響其性質(zhì);而記錄表的行一般表達記錄,而列往往為字段,二者不可互換。
2,二維數(shù)組的大小形狀和數(shù)據(jù)來源有關(guān),是一起提供的;而記錄表的列(字段)來源和行(記錄)的來源是不同的。
3,二維數(shù)組不同維度的下標(biāo)都是整數(shù)(或者是切片),而記錄表的行是整數(shù)或切片下標(biāo),列是字段名來訪問。
4,二維數(shù)組在語法上是二維的,而記錄表在大部分語言的語法中,是類型為記錄的一維數(shù)組。
多維數(shù)組 VS 數(shù)組的數(shù)組
這是一個很奇怪的命題……但是在許多語言的語法中確實是這樣的。典型的例子:C語言。
二者從語法上來看,區(qū)別就是:前者是a[1,2],后者是a[1][2]。
出現(xiàn)后者的原因,主要是看語法本身的支持程度了。對于后者,有些時候是語法限制下表達多維數(shù)組的某種辦法而已。例如在python中,用list或者tuple來表達多維數(shù)組的時候就是這樣的。
在各種語言中,表達多維數(shù)組常數(shù)的時候,往往使用的也是數(shù)組的數(shù)組的表達方式。例如:
[ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]
這實際上就是一個由3個長度為4的一維數(shù)組組成的一個“數(shù)組的數(shù)組”,但是實際表達的是3x4的二維數(shù)組。
對于數(shù)組的數(shù)組,大家要注意的就是別變成參差數(shù)組。當(dāng)然參差數(shù)組也并不是壞事,它的最大特點是節(jié)約內(nèi)存,例如,字符串?dāng)?shù)組,實際上就是參差數(shù)組……
還是要提一下python,它本身是不提供數(shù)組的,list/tuple都是所謂的動態(tài)數(shù)據(jù)結(jié)構(gòu)。而真正的數(shù)組是通過numpy.ndarray來提供的,內(nèi)部本質(zhì)是面向?qū)ο蠹舆\算符重載,不過對于大家來說當(dāng)做多維數(shù)組用就是了。
多維數(shù)組的存儲
對于多維數(shù)組來說,邏輯上的概念中是多維的,而實際上計算機內(nèi)存大家都知道是線性的,磁盤文件存儲拋開柱面、磁道、扇區(qū)等等物理概念,邏輯上也是線性的。那么這二者是怎么協(xié)調(diào)的呢?
這時候,多維數(shù)組實際上被“攤平”了,變形成一維數(shù)組進行存放。這個情況下有兩種方法來攤平,一種是行優(yōu)先,一種是列優(yōu)先,或者換句話說就是下標(biāo)從左到右攤平還是從右到左。
可能聽得有點暈,不過不要緊,大家只要記得會攤平就行了。不過不要以為這個操作對咱們處理數(shù)據(jù)沒影響,實際上有的。舉兩個常見的例子:
IDL的where函數(shù),大家基本上都用過。這個函數(shù)返回的是滿足條件的元素的下標(biāo)(實際上就是參數(shù)中為1的元素下標(biāo))。這時候返回的下標(biāo),就是原數(shù)組攤平之后的下標(biāo),是一維的。相對來說,np.where返回的,則是原始的下標(biāo)。
在IDL中,除了多維下標(biāo)的方式訪問數(shù)據(jù),也可以直接使用攤平后的一維下標(biāo)來訪問數(shù)據(jù)。這在各種編程語言中都是比較特殊的。
另外一個例子,如果大家在matplotlib中畫直方圖(hist),畫的是一個二維數(shù)組的原始的分布圖,就會發(fā)現(xiàn)很尷尬的一件事,m*n的數(shù)組,它給你畫n個直方圖疊在一起……因為它對每一行都去畫了一個直方圖。這個時候,我們就需要主動把數(shù)組攤平:plt.hist(a.flatten()),這樣就把整個數(shù)組單獨拿來畫圖了。當(dāng)然用reshape也可以。
除了這兩個地方不同,還有一個地方可能大家編程的時候都會被提醒的:在astropy讀入的fits圖像中,要選擇某個像元,必須是a[y,x]。這其實也是因為數(shù)據(jù)的內(nèi)部行、列優(yōu)先不同造成的。
多維數(shù)組的統(tǒng)計
最后說一下,多維數(shù)組的統(tǒng)計的事情。假如有數(shù)組a,是m*n*k的,那么我們可以求出以下一系列均值:
python:
m = np.mean(a):求出全部元素的均值,是一個值
m = np.mean(a, axis=0):對第0維求均值,m是n*k的二維數(shù)組,m[i, j]是mean(a[:, i, j])
m = np.mean(a, axis=(1,2)),對第1、2維求均值,m是長為m的一維數(shù)組,m[i]是mean(a[i, :, :])
上面的例子中,選取的是前面或者后面的維度進行統(tǒng)計,實際上維度是可以任意組合的。
IDL也類似:
m = mean(a):求全部元素平均值。
m = mean(a, dim=1):對第1維求均值,m是n*k的數(shù)組。注意:盡管IDL的下標(biāo)是從0開始的,但是在表達維度的時候,是從1開始的。其實內(nèi)在原因是,dim=0的話,這個參數(shù)就會被默認當(dāng)做沒有賦值……
至于上面的最后那個寫法,IDL不支持……
好了,就這么多了……我實在憋不出別的東西來了。有啥問題,下期再見
歡迎關(guān)注“小林在線”
一個可能有點看不懂的公號
總結(jié)
以上是生活随笔為你收集整理的python 二维数组长度_谈一谈多维数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用PPT编制方案 (2)PPT
- 下一篇: switch判断条件