基于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迭代器的使用方法实例
Nov 21 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python scrapy爬虫代码及填坑
Aug 12 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
解决Django no such table: django_session的问题
Apr 07 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 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设计模式 注册表模式
2012/02/05 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
php获取网页请求状态程序示例
2014/06/17 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
PHP crc32()函数讲解
2019/02/14 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
vue2组件之select2调用的示例代码
2017/10/12 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
layui原生表单验证的实例
2019/09/09 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python 调用HBase的简单实例
2016/12/18 Python
python 编写简单网页服务器的实例
2018/06/01 Python
Python程序控制语句用法实例分析
2020/01/14 Python
pandas针对excel处理的实现
2021/01/15 Python
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
事业单位个人应聘自荐信
2013/09/21 职场文书
文明寝室标语
2014/06/13 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记