Python实现二维数组叠加为三维数组的三种方法

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

本文介绍在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示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表