Python NumPy reshape用法详解与多维数组合并实战

Ada
Ada
发布时间:2026-10-13 | 5人浏览过
原创

本文详细介绍Python NumPy库中reshape、resize、swapaxes及flatten等数组变形函数的用法与区别。重点讲解将多个二维数组合并为三维数组的三种方法:直接构造、append重组及list转换,分析各方法的适用场景与性能差异,并提供完整代码示例。

NumPy数组变形基础函数

reshape(shape)函数用于在不改变数组元素内容的前提下,返回一个指定形状的新数组。原数组保持不变,该操作主要对数组内部的元素排列进行重新组织。

resize(shape)函数的功能与reshape()类似,用于调整数组形状,但其关键区别在于它会直接修改原数组,而不是返回一个新数组。


In [1]: a = np.arange(20)
#原数组不变
In [2]: a.reshape([4,5])
Out[2]:
array([[ 0, 1, 2, 3, 4],
  [ 5, 6, 7, 8, 9],
  [10, 11, 12, 13, 14],
  [15, 16, 17, 18, 19]])
 
In [3]: a
Out[3]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  17, 18, 19])
 
#修改原数组
In [4]: a.resize([4,5])
 
In [5]: a
Out[5]:
array([[ 0, 1, 2, 3, 4],
  [ 5, 6, 7, 8, 9],
  [10, 11, 12, 13, 14],
  [15, 16, 17, 18, 19]])

.swapaxes(ax1, ax2)函数用于将数组中指定的两个维度进行互换。例如,将第0维和第1维交换,该操作不会改变原数组的数据,仅改变其维度视角。


In [6]: a.swapaxes(1,0)
Out[6]:
array([[ 0, 5, 10, 15],
  [ 1, 6, 11, 16],
  [ 2, 7, 12, 17],
  [ 3, 8, 13, 18],
  [ 4, 9, 14, 19]])

.flatten()函数用于将多维数组降维展开为一维数组。它返回折叠后的一维数组副本,而原始数组的结构保持不变。


In [7]: a.flatten()
Out[7]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  17, 18, 19])

多维数组合并实战方法

在实际数据处理中,常需要将多个二维数组合并为一个三维数组,以便进行批量处理或模型输入。

实现合并的方法有多种,首先介绍最直观的一种。

方法一:对于维度相同的多个矩阵,可以直接利用np.array()将它们作为列表元素传入,从而构造出一个新的多维数组。这种方式变相实现了维度的扩展。例如,将三个形状为(2, 3)的矩阵合并,可以得到一个形状为(3, 2, 3)的三维数组。


import numpy as np
 
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[2,2,3],[4,5,6]])
c = np.array([[3,2,3],[4,5,6]])
print('矩阵a:\n',a)
print('维数:',a.shape)
 
com = np.array([a,b,c])
print('合并矩阵:\n',com)
print('维数:',com.shape)
 
输出结果为:
 
矩阵a:
 [[1 2 3]
 [4 5 6]]
维数: (2, 3)
合并矩阵:
 [[[1 2 3]
 [4 5 6]]
 
 [[2 2 3]
 [4 5 6]]
 
 [[3 2 3]
 [4 5 6]]]
维数: (3, 2, 3)

然而,当待合并的数组维度不一致时,方法一可能无法得到预期的三维结构。

具体表现为,如果直接对形状不同的数组使用np.array(),生成的数组可能是一个包含不同形状子数组的一维对象数组,而非规则的三维数组。


import numpy as np
 
aa = np.array([[[1,2,3],[4,5,6]],[[2,2,3],[4,5,6]],[[3,2,3],[4,5,6]]])
a = np.array([[4,2,3],[4,5,6]])
 
com = np.array([aa,a])
print('合并矩阵:\n',com)
print('维数:',com.shape)
 
输出结果:
 
合并矩阵:
 [array([[[1, 2, 3],
  [4, 5, 6]],
 
  [[2, 2, 3],
  [4, 5, 6]],
 
  [[3, 2, 3],
  [4, 5, 6]]])
 array([[4, 2, 3],
  [4, 5, 6]])]
维数: (2,)

如上例所示,输出的形状为(2,),这表明数组并未正确合并为预期的三维结构,因此该方法在此场景下不适用。

针对维度不一致的情况,需要结合np.append()和array.reshape()函数。先通过append将数组拼接成一维向量,再利用原数组的维度信息重新塑造形状。


import numpy as np
 
aa = np.array([[[1,2,3],[4,5,6]],[[2,2,3],[4,5,6]],[[3,2,3],[4,5,6]]])
a = np.array([[4,2,3],[4,5,6]])
data = np.append(aa,a)#先拼接成一个行向量
print(data)
 
dim = aa.shape#获取原矩阵的维数
print('原矩阵维数:',dim)
data1 = data.reshape(dim[0]+1,dim[1],dim[2])#再通过原矩阵的维数重新组合
 
print('合并矩阵:\n',data1)
print('维数:',data1.shape)

reshape后的数据分布解析

接下来分析使用reshape将二维数据转换为三维数据后的具体分布情况。


import numpy as np
b = np.arange(36).reshape((6,6))
b1 = b.reshape(2,3,6)

以矩阵b为例,其初始形状为6x6。

经过b1 = b.reshape(2, 3, 6)处理后,矩阵b1的元素分布发生变化。

观察可知,原来的6x6矩阵被分割为2个3x6的矩阵。每一行内部的数据顺序未变,只是将前3行归为一个维度块,后3行归为另一个维度块,从而形成三维结构。


b1.reshape(6,6)

若对b1执行b1.reshape(6, 6),则三维结构被还原为原始的二维矩阵,数据内容与b完全一致。


b1.reshape(3,12)

若执行reshape(3, 12),系统会先将数据完全展平为一维序列,然后再按照3行12列的规则重新排列。这展示了reshape参数对数据重组逻辑的影响。

基于列表转换的合并方案

除了上述方法,还有一种基于列表转换的“曲线救国”方案。

该方法的思路是先将NumPy数组转换为Python列表,利用列表的append特性进行拼接,最后再转换回NumPy数组。

这种方法利用了list中append()函数在添加元素时不改变原有列表维度的特性。虽然文中未进行严格的性能测试,但从逻辑上看,涉及多次类型转换和内存分配,时间复杂度较高,建议在性能敏感场景中慎用。


aa = np.array([[[1,2,3],[4,5,6]],[[2,2,3],[4,5,6]],[[3,2,3],[4,5,6]]])
a = np.array([[4,2,3],[4,5,6]])
 
#将array转换成list
aa = aa.tolist(aa)
a = a.list(a)
 
aa.append(a)#注意与方法二中np.append()用法的区别
com = np.array(aa)
print(com.shape)
 
输出结果:
 
合并矩阵:
  [[[1 2 3]
  [4 5 6]]
 
  [[2 2 3]
  [4 5 6]]
 
  [[3 2 3]
  [4 5 6]]
  
  [[4 2 3]
  [4, 5, 6]]]
维数: (4,2,3)

在使用列表转换法时,需要注意数组与列表之间的相互转换。

以下是两种常用的类型转换函数。

将NumPy数组转换为列表:a = a.tolist()。

将列表转换为NumPy数组:a = np.array(a)。

以上内容涵盖了Python NumPy中reshape及相关数组操作的核心用法,以及多维数组合并的多种实现路径,希望能为读者提供实用的参考。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表