多維陣列的索引方案與記憶體設計
阿新 • • 發佈:2022-03-13
多維陣列的記憶體結構
類似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]
&b[2][1] = &b + 2 * strides[0] + 1 * strides[1]; // &b + 9
所以我們假設陣列b的資料實際儲存在連續的一維記憶體段data[]
中,那麼最終b[2][1]
訪問的應該是data[9]