3D/4D数组在列主序、行主序下的内存存储(MATLAB/NumPy)
高维数组内存存储细节解答
示例代码
NumPy代码
import numpy as np A = np.array([[1,2,3],[4,5,6],[7,8,9]]) B = np.array([[10,20,30],[40,50,60],[70,80,90]]) arr3D = np.array([A,B])
MATLAB代码
A = [1 2 3;4 5 6; 7 8 9]; B = [10 20 30;40 50 60; 70 80 90]; arr3D(:,:,1) = A; arr3D(:,:,2) = B;
1. 3D数组列主序存储序列
列主序(MATLAB默认存储方式)的核心规则:最右侧维度变化最慢,最左侧维度变化最快。对于示例中MATLAB定义的3×3×2(行×列×页)的3D数组,遍历顺序为:先遍历同一列的所有行,再切换到下一列,全部列遍历完成后再切换到下一页。
对应arr3D的内存存储序列为:|1|4|7|2|5|8|3|6|9|10|40|70|20|50|80|30|60|90|
具体遍历逻辑:
- 第1页(矩阵A):先取第1列所有元素
1,4,7,再取第2列2,5,8,最后取第3列3,6,9 - 第2页(矩阵B):先取第1列所有元素
10,40,70,再取第2列20,50,80,最后取第3列30,60,90
2. 4D数组行主序存储序列
行主序(NumPy默认存储方式)的核心规则:最左侧维度变化最慢,最右侧维度变化最快。将arr3D与元素为其2倍的arr3D2拼接后,得到的4D数组维度为2×3×3×2(矩阵个数×行×列→原数组/2倍数组)。
按照行主序规则,存储时先固定前三个维度(矩阵、行、列),遍历第四个维度的两个元素(原数组值、2倍值),完成当前位置后依次切换列、行、矩阵。
对应4D数组的内存存储序列为:|1|2|2|4|3|6|4|8|5|10|6|12|7|14|8|16|9|18|10|20|20|40|30|60|40|80|50|100|60|120|70|140|80|160|90|180|
具体遍历逻辑:
- 第1个矩阵(A)的每个元素依次取原值和2倍值:
- 行1列1:
1,2;行1列2:2,4;行1列3:3,6 - 行2列1:
4,8;行2列2:5,10;行2列3:6,12 - 行3列1:
7,14;行3列2:8,16;行3列3:9,18
- 行1列1:
- 第2个矩阵(B)的每个元素依次取原值和2倍值:
- 行1列1:
10,20;行1列2:20,40;行1列3:30,60 - 行2列1:
40,80;行2列2:50,100;行2列3:60,120 - 行3列1:
70,140;行3列2:80,160;行3列3:90,180
- 行1列1:
内容的提问来源于stack exchange,提问作者Ardy
相关产品推荐
相关产品推荐

