基于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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
python树的同构学习笔记
Sep 14 Python
Python Django框架模板渲染功能示例
Nov 08 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python错误的处理方法
Jun 23 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
pycharm无法导入lxml的解决办法
Mar 31 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
Python实现自动玩连连看的脚本分享
Apr 04 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
重置版战役片段
2020/04/09 魔兽争霸
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python学习笔记(二)基础语法
2014/06/06 Python
Python中random模块生成随机数详解
2016/03/10 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
使用C++扩展Python的功能详解
2018/01/12 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
甜点店创业计划书
2014/01/27 职场文书
公司离职证明范本
2014/10/17 职场文书
授权委托书
2015/01/28 职场文书
公务员处分决定书
2015/06/25 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript