基于Python对数据shape的常见操作详解


Posted in Python onDecember 25, 2018

这一阵在用python做DRL建模的时候,尤其是在配合使用tensorflow的时候,加上tensorflow是先搭框架再跑数据,所以调试起来很不方便,经常遇到输入数据或者中间数据shape的类型不统一,导致一些op老是报错。而且由于水平菜,所以一些常用的数据shape转换操作也经常百度了还是忘,所以想再整理一下。

一、数据的基本属性

求一组数据的长度

a = [1,2,3,4,5,6,7,8,9,10,11,12]
print(len(a))
print(np.size(a))

求一组数据的shape

list是没有shape属性的,所以需要把它转换成np或者使用np.shape()

b = [[1,2,3],[4,5,6],[7,8,9]]
print(np.shape(b))
print(np.array(b).shape)

二、数据的拼接

append是直接将数组或者数据直接追加到下一个元素的位置,而extend是将数据最外层的[]去掉后追加。

c = [1,1,1,1]
d = [[2,2],[[2,2],[2,2]]]
c.append([1,2,3])
d.extend([1,2,3])

[1, 1, 1, 1, [1, 2, 3]]
[[2, 2], [[2, 2], [2, 2]], 1, 2, 3]

另外也可以通过numpy中的方法来进行拼接

其中np.concatenate()的作用更偏向与数据的连接,通过其中的axis参数可以进行指定行列的拼接。

而np.append()的作用是将value b追加到arr a中。

c = np.concatenate((a, b))
d = np.append(a,b)
print(c)
print(d)

[1 1 1 1 2 2 2 2]
[1 1 1 1 2 2 2 2]

三、数据的shape的转换

1、转置

数据的转置也经常会用到,通常可以用到numpy的transpose()方法或者直接将数据转换为numpy array后用.T或者用reshape()方法。

a = [[1,1,1],
   [1,1,1]]
b = [[2,2,2],
   [2,2,2]]
c = [[3,3,3],
   [3,3,3]]
b = np.array(b)
c = np.array(c)

print(np.transpose(a))
print(b.T)
print(np.reshape(c, (c.shape[1], c.shape[0])))

[[1 1]
 [1 1]
 [1 1]]
[[2 2]
 [2 2]
 [2 2]]
[[3 3]
 [3 3]
 [3 3]]

2、数据展开

如果是一个多维的数组,可以直接使用np.reshape(-1)来进行转换,reshape是一个很好用的函数,其中的参数含义后面会讲到。

c = [[[3,3,3],
   [3,3,3]],
   [[2,2,2],
   [2,2,2]]]

print(np.reshape(c, -1))

[3 3 3 3 3 3 2 2 2 2 2 2]

3、维度转换

有时候可能会用到将一个一维的数组转换为二维,或者是在column方向或row方向上增加维度。

当给col方向增加维度时,可以直接arr[:,np.newaxis],

给row方向增加维度时,可以arr[np.newaxis,:]

另外,这里的np.newaxis可以这样理解:

一个[1,2,3,4,5]数组的shape是(5,),如果对它[:,np.newaix]的话,得到的shape就是(5,1)

对它[np.newaix, :]的话,得到的结果就是(1,5)。所以说newaxis加在哪个位置,哪个位置相应的维度就会产生一个新的维度。

a = np.array([1,1,1,1])

b = a[np.newaxis,:]
c = a[:,np.newaxis]

print(b)
print(c)

[[1 1 1 1]]
[[1]
 [1]
 [1]
 [1]]

另外再说一个将多维数组转换为一维的两种方法:arr.ravel()和arr.flatten()。

两者的不同之处在于arr.flatten()返回的是arr展开后的数组的复制,而arr.ravel()返回的是arr展开后的本身。

一个是对值的操作,另一个是对地址的操作。

类似c、c++中的指针。

a = np.array([[1,2,3]])
b = np.array([[1,2,3]])
a1 = a.flatten()
b1 = b.ravel()
print(a)
print(b)
a1[0] = 8
b1[0] = 8
print(a)
print(b)

[[1 2 3]]
[[1 2 3]]
[[1 2 3]]
[[8 2 3]]

4、reshape

def reshape(a, newshape, order='C'):

其中newshape参数可以传入一个[]或者tuple。

当数据的形状不确定时,如果想转换为1行,列数不确定的话,newshape可以传入(1, -1);

如果想转换为1列,行数不确定的话,newshape可以传入(-1, 1);

同理如果是2列或者2行的话,就是(-1, 2)或者(2,-1)。

其中-1代表的是一个模糊控制,就是不确定的意思。

a = [[1,1,1],
   [1,1,1]]
b = [[2,2,2],
   [2,2,2]]
c = [[[3,3,3],
   [3,3,3]],
   [[2,2,2],
   [2,2,2]]]

print(np.reshape(c, [-1, 1]))
print(np.reshape(b, [-1, 1]))
print(np.reshape(c, [2, -1]))

[[3]
 [3]
 [3]
 [3]
 [3]
 [3]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]]
[[2]
 [2]
 [2]
 [2]
 [2]
 [2]]
[[3 3 3 3 3 3]
 [2 2 2 2 2 2]]

以上这篇基于Python对数据shape的常见操作详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
python字符串替换的2种方法
Nov 30 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
python通过zabbix api获取主机
Sep 17 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
Django基础知识 URL路由系统详解
Jul 18 Python
python爬虫增加访问量的方法
Aug 22 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 #Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 #Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 #Python
Python lambda表达式用法实例分析
Dec 25 #Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 #Python
浅谈python 读excel数值为浮点型的问题
Dec 25 #Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 #Python
You might like
虫族 Zerg 魔法科技
2020/03/14 星际争霸
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
php checkbox 取值详细说明
2010/08/19 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
33种Javascript 表格排序控件收集
2009/12/03 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python线性回归实战分析
2018/02/01 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
python Gabor滤波器讲解
2020/10/26 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
迟到检讨书900字
2014/01/14 职场文书
社区包粽子活动方案
2014/01/21 职场文书
商场中秋节活动方案
2014/02/07 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
优秀教师单行材料
2014/12/16 职场文书