基于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之Import 模块
Oct 13 Python
在Python中处理XML的教程
Apr 29 Python
Django返回json数据用法示例
Sep 18 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python实现字符串匹配的KMP算法
Apr 04 Python
Python安装Flask环境及简单应用示例
May 03 Python
python时间序列按频率生成日期的方法
May 14 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
pycharm 复制代码出现空格的解决方式
Jan 15 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
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
JavaScript入门教程(3) js面向对象
2009/01/31 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
python 模拟登陆github的示例
2020/12/04 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
护士求职推荐信范文
2013/11/23 职场文书
影视制作岗位职责
2013/12/04 职场文书
体育活动总结
2015/02/04 职场文书
实习指导老师意见
2015/06/04 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
入门学习Go的基本语法
2021/07/07 Golang