基于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对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
对pandas replace函数的使用方法小结
May 18 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
django ajax发送post请求的两种方法
Jan 05 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
Python调用飞书发送消息的示例
Nov 10 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
如何用python绘制雷达图
Apr 24 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
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
vue axios登录请求拦截器
2018/04/02 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
python 实现插入排序算法
2012/06/05 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Python小进度条显示代码
2019/03/05 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
中学教师自我鉴定
2014/02/07 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
公司证明怎么写
2014/09/22 职场文书
初中作文评语
2014/12/25 职场文书
大二学年个人总结
2015/03/03 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
Python如何加载模型并查看网络
2022/07/15 Python