NumPy 函数手册:数组结构调整

发布时间:2026/7/5 8:32:43

NumPy 函数手册:数组结构调整 在数据分析、科学计算以及机器学习中除了对数组元素进行读写操作外还经常需要对数组的结构如 形状 shape、维度 dimension 等进行调整。NumPy 提供了一组用于数组结构调整的函数这些函数通常不改变数据本身而是改变其组织方式视图或副本。按照功能划分NumPy 中常见的调整数组结构的函数通常可以分为以下几类1形状调整2数组展开3维度变化4维度保证5轴变换一、形状调整reshape()在不改变数据的前提下改变数组的形状。返回重构后的数组通常为视图。numpy.reshape(a, newshape, orderC)ndarray.reshape(newshape, orderC)numpy.reshape() 是面向通用输入的函数接口而 ndarray.reshape() 是面向数组对象的方法接口两者在行为上等价但在调用方式与输入类型支持上有所不同。参数说明• a输入数组• newshape目标形状整数或元组• order元素读取顺序C按行优先C-order最后一维变化最快F按列优先Fortran-order首维变化最快示例 1a np.array([1,2,3,4,5,6])b a.reshape((2,3))输出[[1 2 3] [4 5 6]]说明• 元素总数必须保持一致即新的 shape 的维度长度之积应等于元素总数• reshape() 尽量返回视图。当数组在内存中不满足连续性要求时reshape() 可能返回副本而非视图示例 2支持 -1 自动推导维度a np.arange(12)# [ 0 1 2 3 4 5 6 7 8 9 10 11] b a.reshape(3, -1)输出[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]说明-1 的作用是让 NumPy 自动计算该维度大小。只能出现一次。resize()改变数组形状并在必要时填充或截断数据。numpy.resize(a, new_shape)参数说明• a输入数组• new_shape目标形状不足时循环填充返回值返回新数组副本。示例a np.arange(6)# [ 0 1 2 3 4 5 ] b np.resize(a,(3,4))输出[[0 1 2 3] [4 5 0 1] [2 3 4 5]]说明与 reshape() 不同必要时改变元素数量。特别说明ndarray.resize(new_shape) 会原地修改数组并可能改变数据内容截断或重复填充。二、数组展平ravel()将数组展开为一维数组。返回一维数组优先返回视图但在某些情况下仍可能返回副本。numpy.ravel(a, orderC)参数说明• a输入数组• order展开顺序C、F、A、KC行优先顺序最后一维变化最快F列优先顺序首维变化最快A按数组内存布局自适应选择 C 或 FK严格按照内存中的实际存储顺序读取元素示例 1a np.array([[1, 2, 3], [4, 5, 6]]) b np.ravel(a)print(b)# [1 2 3 4 5 6]ravel() 优先返回视图view修改结果可能会影响原数组取决于内存连续性# 修改 b观察是否影响原数组b[0] 100print(a)输出[[100 2 3] [ 4 5 6]]示例 2不同 ordera np.array([[1, 2], [3, 4]]) print(np.ravel(a, orderC)) # 行优先# [1 2 3 4]print(np.ravel(a, orderF)) # 列优先# [1 3 2 4]flatten()将数组展开为一维数组副本。ndarray.flatten(orderC)参数说明同 ravel。示例a np.array([[1, 2, 3], [4, 5, 6]]) b a.flatten()print(b)# [1 2 3 4 5 6] # 修改 b不影响原数组b[0] 100print(a)# [[1 2 3]# [4 5 6]]说明ravel() 优先返回视图flatten() 始终返回副本。三、维度变化squeeze()删除长度为 1 的维度。numpy.squeeze(a, axisNone)参数说明• a输入数组• axis指定要删除的轴必须长度为 1示例 1a np.array([[[10, 20, 30]]])print(a.shape)# (1, 1, 3) b np.squeeze(a)print(b.shape)# (3,)示例 2指定轴a np.array([[[10, 20, 30]]]) b np.squeeze(a, axis0)print(b.shape)# (1, 3)说明squeeze() 只能删除长度为 1 的轴。若指定 axis 且该轴长度 ≠ 1会报错。expand_dims()在指定位置增加一个维度。numpy.expand_dims(a, axis)参数说明• a输入数组• axis插入新轴的位置可为负数示例 1a np.array([10, 20, 30])print(a.shape)# (3,) b np.expand_dims(a, axis0)print(b.shape)# (1, 3) c np.expand_dims(a, axis1)print(c.shape)# (3, 1)示例 2使用负轴d np.expand_dims(a, axis-1)print(d.shape)# (3, 1)说明squeeze() 用于降维即去掉长度为 1 的维度。expand_dims() 用于升维即插入长度为 1 的新维度。四、维度保证这些函数常用于函数接口输入统一。atleast_1d()确保数组至少为一维。返回转换后的数组或数组列表。numpy.atleast_1d(*arys)参数说明• *arys一个或多个输入标量或数组示例x 5 a np.atleast_1d(x)print(a)# [5]print(a.shape)# (1,)atleast_2d()确保数组至少为二维。返回转换后的数组或数组列表。numpy.atleast_2d(*arys)参数说明• *arys一个或多个输入标量或数组示例 1x [1, 2, 3] a np.atleast_2d(x)print(a)# [[1 2 3]]print(a.shape)# (1, 3)示例 2多输入多输出a, b np.atleast_2d(1, [1, 2, 3]) print(a, a.shape)# [[1]] (1, 1)print(b, b.shape)# [[1 2 3]] (1, 3)atleast_3d()确保数组至少为三维。返回转换后的数组或数组列表。numpy.atleast_3d(*arys)参数说明• *arys一个或多个输入标量或数组示例x [1, 2, 3] a np.atleast_3d(x)print(a.shape)# (1, 3, 1)对于上面三个函数都遵循以下原则• 标量会被“提升”为数组• 已有维度不会被压缩五、轴变换transpose()重新排列数组的轴顺序。返回轴重排后的数组通常为视图。numpy.transpose(a, axesNone)或者ndarray.transpose(*axes)参数说明• a输入数组• axes新的轴顺序元组示例 1默认转置a np.array([[1, 2, 3], [4, 5, 6]]) b np.transpose(a)输出[[1 4] [2 5] [3 6]]示例 2指定轴顺序高维a np.arange(24).reshape(2, 3, 4) b np.transpose(a, (1, 0, 2))print(b.shape)# (3, 2, 4)说明(1, 0, 2) 表示原 axis 1 → 新 axis 0原 axis 0 → 新 axis 1原 axis 2 → 新 axis 2不变特别说明数组属性 T 是 transpose() 的语法糖形式。a.T 等价于np.transpose(a)对于二维数组而言a.T 就是行列互换返回结果通常也为视图。对于高维数组a.T 等价于将轴顺序完全反转a.T ≡ np.transpose(a, axes[::-1])swapaxes()交换两个轴。numpy.swapaxes(a, axis1, axis2)参数说明• axis1, axis2需要交换的两个轴示例a np.arange(24).reshape(2, 3, 4) b np.swapaxes(a, 0, 1)print(b.shape)# (3, 2, 4)说明swapaxes() 只交换两个轴可看作是 transpose() 的特例。moveaxis()将指定轴移动到新位置。numpy.moveaxis(a, source, destination)参数说明• source原轴位置• destination目标位置示例 1a np.arange(24).reshape(2, 3, 4) b np.moveaxis(a, 0, 2)print(b.shape)# (3, 4, 2)示例 2多轴移动b np.moveaxis(a, [0, 2], [2, 0])print(b.shape)# (4, 3, 2)说明moveaxis() 支持多轴同时移动语义清晰推荐使用。rollaxis()将某个轴滚动到指定位置。numpy.rollaxis(a, axis, start0)参数说明• axis要移动的轴• start目标位置示例a np.arange(24).reshape(2, 3, 4) b np.rollaxis(a, 2, 0)print(b.shape)# (4, 2, 3)说明rollaxis() 本质上等价于 moveaxis(axis, start)它已逐渐被替代不推荐新代码使用。 小结NumPy 提供了一套完整的数组结构调整机制包括形状重塑reshape、resize、数组展开ravel、flatten、维度增减squeeze、expand_dims、维度规范化atleast_*以及轴变换transpose、swapaxes、moveaxis。需要特别注意不同函数在是否返回视图或副本、是否改变原数组以及内存连续性要求方面存在差异应根据计算需求合理选择以兼顾性能与语义清晰性。“点赞有美意赞赏是鼓励”

相关新闻