Python NumPy reshape用法详解与多维数组合并实战
本文详细介绍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及相关数组操作的核心用法,以及多维数组合并的多种实现路径,希望能为读者提供实用的参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













