
在numpy中,当我们创建一个多维数组时,例如使用np.ones((dim1, dim2, dim3)),这些维度参数的顺序并非随意。它们定义了数组的形状(shape),即每个维度上元素的数量。对于一个形状为(a, b, c)的三维数组,我们可以直观地将其理解为:
例如,np.ones((3, 2, 2))表示一个包含3个2x2矩阵的数组。这与许多图像处理或深度学习框架中常见的(通道数, 高度, 宽度)或(批次大小, 高度, 宽度, 通道数)的理解是相似的。
NumPy默认遵循C语言风格的内存布局,也称为行主序(Row-major order)。在这种布局下,数组的最后一个维度在内存中是连续存放的,这意味着当遍历数组时,最后一个维度的索引变化最快。
对于一个形状为(A, B, C)的数组x:
示例:
import numpy as np
# 创建一个形状为 (3, 2, 2) 的三维数组
# 默认采用C-order
arr_c_order = np.arange(12).reshape((3, 2, 2))
print("C-order 数组:\n", arr_c_order)
print("C-order 数组的形状:", arr_c_order.shape)
print("C-order 数组的步长 (bytes):", arr_c_order.strides) # (8, 4, 4) if dtype is int32, (16, 8, 8) if int64
# 解释步长:
# 对于 arr_c_order[i, j, k]:
# 改变 i (第一个维度) 会跳过 2*2*itemsize 字节
# 改变 j (第二个维度) 会跳过 2*itemsize 字节
# 改变 k (第三个维度) 会跳过 1*itemsize 字节 (itemsize取决于数据类型,例如int64是8字节)在上面的例子中,如果dtype是int64(8字节),那么strides可能是(32, 16, 8)。这意味着:
这清晰地表明了最后一个维度(列)的元素在内存中是紧密排列的。
NumPy也支持Fortran语言风格的内存布局,称为列主序(Column-major order)。在这种布局下,数组的第一个维度在内存中是连续存放的,这意味着当遍历数组时,第一个维度的索引变化最快。
可以通过在创建数组时指定order='F'参数来启用Fortran顺序。
对于一个形状为(A, B, C)的数组x(Fortran顺序):
示例:
# 创建一个形状为 (3, 2, 2) 的三维数组,指定Fortran-order
arr_f_order = np.arange(12).reshape((3, 2, 2), order='F')
print("\nFortran-order 数组:\n", arr_f_order)
print("Fortran-order 数组的形状:", arr_f_order.shape)
print("Fortran-order 数组的步长 (bytes):", arr_f_order.strides) # (4, 12, 24) if dtype is int32, (8, 24, 48) if int64
# 解释步长:
# 对于 arr_f_order[i, j, k]:
# 改变 i (第一个维度) 会跳过 1*itemsize 字节
# 改变 j (第二个维度) 会跳过 3*itemsize 字节
# 改变 k (第三个维度) 会跳过 3*2*itemsize 字节同样,如果dtype是int64(8字节),那么strides可能是(8, 24, 48)。这意味着:
这表明了第一个维度(行)的元素在内存中是紧密排列的。
用户提到希望像PyTorch那样组织数据为[Channel, Row, Columns]。在NumPy中,默认的C-order (A, B, C)可以很好地映射到(Depth/Batch/Channel, Height, Width)这样的结构。
NumPy多维数组的维度顺序和内存布局是其核心概念之一。默认的C-order(行主序)意味着最后一个维度变化最快,元素在内存中连续存放。而Fortran-order(列主序)则意味着第一个维度变化最快。理解这两种布局及其对strides的影响,对于高效地组织数据、优化计算性能以及与不同编程语言或库进行数据交互都至关重要。在大多数Python和NumPy应用中,坚持使用默认的C-order是一个稳妥且高效的选择。
以上就是深入理解NumPy多维数组的维度顺序与内存布局的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号