arrays - 3D/4D 数组如何以列优先顺序在内存中连续存储?

标签 arrays numpy matlab memory column-major-order

虽然我可以轻松理解二维数组,但我想知道 MATLAB(或修改后的 NumPy)在内存中存储高维数组的精确度如何。为了避免抽象答案,我提出了有关 3D 数组和 4D 数组的具体示例的问题:

3D 数组,我们称之为 arr3D可以可视化为两个 3×3 矩阵 AB哪里B堆叠在 A 之上就像一本(面朝上)书页彼此堆叠在一起。

第 1 页是:

<表类=“s-表”> <标题> <正文> 1 2 3 4 5 6 7 8 9

第 2 页是:

<表类=“s-表”> <标题> <正文> 10 20 30 40 50 60 70 80 90

我知道如果存储顺序是行优先,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/

相关文章:

php - 生成所有可能的组合

c++ - 将字符串输入与类数组值进行比较的问题 C++(Unix 环境)(作业)

matlab - 更改 8 位整数的最后一位

c++ - 错误 : expected constructor, 析构函数,或 '(' token 之前的类型转换?

c++ - 从 Matlab 调用的 Mex 函数和数值差

php - 如何从时间戳对象和日期时间对象数组中提取值

javascript - 在 Javascript 中,如何将从 1 个变量生成的数字组合到一个数组中

python - numpy ndarray 索引 - 从元组中检索索引

Python numpy 索引多维数组

python - Numpy 矩阵的综合索引更新