虽然我可以轻松理解二维数组,但我想知道 MATLAB(或修改后的 NumPy)在内存中存储高维数组的精确度如何。为了避免抽象答案,我提出了有关 3D 数组和 4D 数组的具体示例的问题:
3D 数组,我们称之为 arr3D
可以可视化为两个 3×3 矩阵 A
和B
哪里B
堆叠在 A
之上就像一本(面朝上)书页彼此堆叠在一起。
第 1 页是:
第 2 页是:
我知道如果存储顺序是行优先,arr3D
像这样存储在内存中:
|1|2|3|4|5|6|7|8|9|10|20|30|40|50|60|70|80|90|
怎么会arr3D
如果顺序是列优先,则存储在内存中?
假设我们有另一个 3D 数组,名为 arr3D2
其尺寸与 arr3D
相同并且其元素都是 arr3D
中相应元素的两倍.
4D 数组 [arr3D,arr3D2]
会怎样?如果存储顺序是行优先,则存储在内存中?
在 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(:,:,1) = B;
最佳答案
术语“列主”和“行主”实际上仅适用于二维数组,因为它们仅指定哪个维度在内存中是连续的,并且使维度不明确其余尺寸的排序。
NumPy 执行C 排序 或Fortran 排序(C 是默认值)。
C 排序 意味着最后一个维度在内存中是连续的,然后是倒数第二个维度,依此类推,第一个维度最远。即
arr[0,0,0]
接下来是arr[0,0,1]
,arr[0,0,2]
等等,然后是arr[0,1,0]
,arr[0,1,1]
等。在 2D 中,这对应于行主(因为最后一个维度是 NumPy 中的行)。F 排序 则相反。
arr[0,0,0]
接下来是arr[1,0,0]
,arr[2,0,0]
等等,然后是arr[0,1,0]
,arr[1,1,0]
等。在 2D 中,这对应于主要列(因为第一个维度是 NumPy 中的列)。
MATLAB 使用 Fortran 排序,但维度的解释方式与 NumPy 中不同。对于 2D 数组来说是一样的,但 NumPy 将 3D 数组的页作为第一个维度,而 MATLAB 将它们放在最后。因此,在 NumPy 中,列始终是从末尾算起的第二个维度,而在 MATLAB 中,它们始终是第一个维度。但这只是解释差异,而不是存储或索引差异。
PS:实际上,通过重新排序现有数组的维度,可以在 NumPy 中构造具有任意存储顺序的数组。
关于arrays - 3D/4D 数组如何以列优先顺序在内存中连续存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77673019/