基于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中argparse模块用法实例详解
Jun 03 Python
改进Django中的表单的简单方法
Jul 17 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
Python绑定方法与非绑定方法详解
Aug 18 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
python操作列表的函数使用代码详解
Dec 28 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
TensorFLow 变量命名空间实例
Feb 11 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
python实现不同数据库间数据同步功能
Feb 25 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中的字符串函数
2006/11/24 PHP
php session安全问题分析
2011/06/24 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
python提取内容关键词的方法
2015/03/16 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
求职简历中自我评价
2014/01/28 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
团日活动总结
2014/04/28 职场文书
环保建议书300字
2014/05/14 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
学校运动会报道稿
2014/09/23 职场文书
师范生见习报告
2014/10/31 职场文书
刘公岛导游词
2015/02/05 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技