基于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实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
python统计中文字符数量的两种方法
Jan 31 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
Python列表解析操作实例总结
Feb 26 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
用pip给python安装matplotlib库的详细教程
Feb 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数组应该有多大的分析
2009/07/30 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
python获取当前日期和时间的方法
2015/04/30 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
Python3爬虫全国地址信息
2019/01/05 Python
详解python中__name__的意义以及作用
2019/08/07 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
python3的pip路径在哪
2020/06/23 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
华润集团网上药店:健一网
2016/09/19 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
计算机科学与技术专业求职信
2014/09/03 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
销售员自我评价
2015/03/11 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang