python实现把两个二维array叠加成三维array示例


Posted in Python onNovember 29, 2019

遇到这样一个需求:程序中每次循环生成一个二维array,需要把每次循环的二维array叠加成一个三维的array,例如有如下两个矩阵:

python实现把两个二维array叠加成三维array示例

组合成以下这种形式:

python实现把两个二维array叠加成三维array示例

这样组合之后,有一个非常大的优点就是:保持原有的二维array的形式不变,便于以后取出,比如说我想从C中取出A,只需要执行:A=C[0,:]即可。

但是百度之后发现,在python中,numpy函数包中并没有对应的函数来实现三维array中不断添加二维array(有知道这个函数的欢迎在评论区告诉我)

这里,提供两种“曲线救国”的解决方案:

方法一:

对于两个(或者多个)同一维度的矩阵,直接利用np.array()重新构造一个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)

方法二:

但是,如果两个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,)

可以看到:输出的维数不对,以上方法就不适用了。

那么,我们就需要利用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)

输出结果:

python实现把两个二维array叠加成三维array示例

方法三:

相比于前两种方法,这种方法可谓“曲线救国”之典范,具体思路是:先转化成list,拼接后再转化回去。

这是因为list中的append()函数可以在添加函数的时候不改变原来list的维度。虽然没有对这种方法进行一个速度测试,但直觉来看时间复杂度挺高的,建议慎用。

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)

这里注意:

两种类型的相互转换函数:

array转list:a = a.tolist()

list转array:a =np.array(a)

这里需要注意:A.tolist 和 list(A) 外表看,都是把一个array转换成list,但是两者还是有一些区别的。看下边这个例子:

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变成了list,但是里边的每个向量都还是array类型。

最后吐槽一句,其实numpy包中对于一位数组和二维数组的拼接,可选函数很多,但是唯独没有考虑更高维数组的拼接。甚至连重写的append函数都没有原来的好用,真是青出于蓝而败于蓝啊,痛心。强烈建议numpy包在未来的更新中尽快解决这个问题。

在深度学习中,也有类似于这样的需求,比如用图片来训练模型时,彩色图片就是一个个三维数组,需要把一批图片都送到网络中就需要把多个三维矩阵叠加。

tensorflow貌似提供了这样的函数,在搭建深度学习框架时可以直接使用,以后有机会继续扩展。

扩展阅读:

最后,附几个二维array中,添加一行或者一列元素的函数:

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 相关文章推荐
python 图片验证码代码
Dec 07 Python
深入理解Python中变量赋值的问题
Jan 12 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python 格式化输出百分号的方法
Jan 20 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
Python while true实现爬虫定时任务
Jun 08 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 Python
python的time模块和datetime模块实例解析
Nov 29 #Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 #Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 #Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 #Python
基于python判断目录或者文件代码实例
Nov 29 #Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 #Python
python解析命令行参数的三种方法详解
Nov 29 #Python
You might like
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
基于php下载文件的详解
2013/06/02 PHP
php文件缓存类汇总
2014/11/21 PHP
php银联网页支付实现方法
2015/03/04 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
校长就职演讲稿
2014/01/06 职场文书
金融专业大学生自我评价
2014/01/09 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
python 进阶学习之python装饰器小结
2021/09/04 Python