1. 程式人生 > 其它 >多維陣列的索引方案與記憶體設計

多維陣列的索引方案與記憶體設計

多維陣列的記憶體結構

類似ndarray之類的多維陣列,實際上是一個連續的記憶體地址+一種索引方案。我們可以將一個多維陣列物件分為兩部分,一部分是實際儲存陣列資料的連續記憶體段,另一部分是儲存陣列的形狀、索引方案、單元素步長、size等資訊的header段。

如shape屬性指定各維度的元素的數量,dtype屬性指定元素型別及其解釋方式,strides屬性指定各維度的跨度,itemsize屬性指定單個元素佔用位元組數。

dtype itemsize shape strides datasize ...

索引的解析

對於N維的陣列,我們將將各維度的跨度存放在strides

列表中,比如strides[0]表示的是陣列第1維的步長。第k維的步長為

其中我們假設單元素步長為1。假設陣列的首地址為&data,那麼其座標為(i0,i1,i2,...,in-1)的元素地址為

例項1
一個2x3的二維陣列,它的第一維的步長是3,第二維也就是最後一維的步長是1,所以它的strides列表為[3,1]

例項2
一個2x3x4的三維陣列,它的第一維的步長是3x4=12,第二維步長是4,第三維也就是最後一維的步長是1,所以它的strides列表為[12,4,1]

例項3

對於上面這個4x4的陣列,其形狀shape=(4,4),跨度列表strides = [4,1]。
如果我們以b[2][1]

的形式去訪問陣列元素9,那麼索引的解析方案為:

&b[2][1] = &b + 2 * strides[0] + 1 * strides[1]; // &b + 9

所以我們假設陣列b的資料實際儲存在連續的一維記憶體段data[]中,那麼最終b[2][1]訪問的應該是data[9]