Python reshape的用法及多个二维数组合并为三维数组的实例


Posted in Python onFebruary 07, 2020

reshape(shape) : 不改变数组元素,返回一个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) : 将数组n个维度中两个维度进行调换,不改变原数组

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()重新构造一个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)

现在来看一下用reshape将二维数据升为三维后的数据分布情况:

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

b的元素:

Python reshape的用法及多个二维数组合并为三维数组的实例

b1的元素:

Python reshape的用法及多个二维数组合并为三维数组的实例

可以看到,原来6*6的矩阵被分为了2个3*6的矩阵。每一行的数据分布并没有改变,只是将前3行划为一个维度,然后将后三行划为另一个维度。

b1.reshape(6,6)

如果用这条命令,则数据又被还原了回去,与b的一样。

b1.reshape(3,12)

Python reshape的用法及多个二维数组合并为三维数组的实例

如果用的是reshape(3,12),则相当于将数据首先拉伸为1维的,然后再将一维数据重组为3*12

方法三:

相比于前两种方法,这种方法可谓“曲线救国”之典范,具体思路是:先转化成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.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)

这里注意:

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

array转list:a = a.tolist()

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

以上这篇Python reshape的用法及多个二维数组合并为三维数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
老生常谈Python基础之字符编码
Jun 14 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
python学习入门细节知识点
Mar 29 Python
Python输入二维数组方法
Apr 13 Python
python读取文本绘制动态速度曲线
Jun 21 Python
彻底理解Python中的yield关键字
Apr 01 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
django创建简单的页面响应实例教程
Sep 06 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
解决python运行启动报错问题
Jun 01 Python
win10安装python3.6的常见问题
Jul 01 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 #Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 #Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 #Python
详解python itertools功能
Feb 07 #Python
Python中itertools的用法详解
Feb 07 #Python
Python转换itertools.chain对象为数组的方法
Feb 07 #Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 #Python
You might like
php相当简单的分页类
2008/10/02 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python制作词云的方法
2018/01/03 Python
JMS中Topic和Queue有什么区别
2013/05/15 面试题
Linux常见面试题
2013/03/18 面试题
会计系中文个人求职信
2013/12/24 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript