Python实现二维数组叠加为三维数组的三种方法
本文介绍在Python中如何将多个二维数组叠加为三维数组。通过np.array()直接构造、利用np.append配合reshape重组、以及转换为list后拼接再转回array三种方法,详细解析了各方案的代码实现、适用场景及注意事项,并对比了array与list转换的差异。
问题背景与需求
在程序开发中,常遇到循环生成二维数组的需求,若需将这些每次循环产生的二维数组合并为一个统一的三维数组,该如何操作?假设现有如下两个矩阵示例:

目标是将它们组合成如下形式的结构:

这种组合方式的一个显著优势在于:它保持了原有二维数组的结构完整性,便于后续数据的提取。例如,若要从合并后的三维数组C中提取出原始的A矩阵,只需执行A=C[0,:]即可。
经查阅资料发现,Python标准库numpy中并未直接提供在三维数组中动态添加二维数组的专用函数(若有了解该函数的读者,欢迎在评论区补充)。
解决方案概述
为此,这里提供三种“曲线救国”的替代解决方案:
方法一:直接构造
方法一:
对于两个或多个维度相同的矩阵,可以直接利用np.array()重新构造一个新的数组,以此变相实现维度的扩展。具体示例如下:
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)
方法二:拼接与重组
方法二:
然而,如果涉及的数组维度不一致,使用方法一可能会得到如下结果:
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,)
由此可见,输出的维度不符合预期,上述方法在此场景下不再适用。
此时,我们需要利用np.append和array.reshape()函数对数组进行拼接后再重新组合,具体实现代码如下:
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)
执行后的输出结果如下:

方法三:列表转换法
方法三:
相较于前两种方法,这种方法堪称“曲线救国”的典范。其核心思路是:先将数组转换为列表(list),完成拼接操作后再转换回数组(array)。
这是因为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.tolist(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)
注意事项与转换差异
在此需要特别注意:
数组与列表之间相互转换的函数如下:
数组转列表:a = a.tolist()
列表转数组:a = np.array(a)
这里需要特别指出:A.tolist()和list(A)在表面效果上都是将数组转换为列表,但两者存在本质区别。请看以下示例:
A = np.reshape(np.arange(6),(3,2)) #生成一个3行2列的array
print("数组A:",A)
print('A.tolist():',A.tolist())
print('list(A): ',list(A))
运行结果如下:
数组A:
array([[0, 1],
[2, 3],
[4, 5]])
A.tolist(): [[0, 1], [2, 3], [4, 5]]
list(A): [array([0, 1]), array([2, 3]), array([4, 5])]
从结果可以看出:list(A)仅将最外层的数组转换为列表,而内部的每个向量仍然保持为array类型。
最后吐槽一句,其实numpy包中对于一维数组和二维数组的拼接,可选函数很多,但唯独没有充分考虑更高维数组的拼接需求。甚至连重写的append函数都不如原函数好用,真是“青出于蓝而败于蓝”,令人痛心。强烈建议numpy包在未来的更新中尽快解决这一问题。
深度学习中的应用场景
在深度学习领域,也有类似的需求场景。例如,使用图片训练模型时,彩色图片本身就是一个个三维数组,若需将一批图片送入网络进行训练,就需要将多个三维矩阵进行叠加。
TensorFlow似乎提供了相关的函数,在搭建深度学习框架时可直接使用,未来有机会再进一步扩展讨论。
扩展阅读:
扩展:二维数组行列添加
最后,附上几个在二维数组中添加一行或一列元素的函数:
1. np.append(a,b,axis=数字)
其中:
没有axis属性:将所有元素展开
axis = 0:添加n行
axis = 1:添加n列
口诀:0行1列,适用于所有numpy函数的axis属性。
2. 增加一行或者一列。
b = np.row_stack((a, 行元素))# 添加行
c = np.column_stack((a, 列元素)) #添加列
以上这篇python实现把两个二维array叠加成三维array示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









