Python调整数组形状如何实现
作者:微小冷 发布时间:2021-01-06 09:55:34
标签:Python,调整,数组形状
调整形状 | |
调整形状 | reshape, resize, flatten, ravel, squeeze |
调整坐标轴 | transpose, swapaxes |
更改维度
数组中的数据在内存里是固定的,但计算时的排列方式却可以随时更改,这也是数组的强大之处。其中,reshape
和resize
功能相同,区别是前者返回新数组,后者则直接修改原始数组。
>>> x = np.arange(12)
>>> y = x.reshape(2,6)
>>> print(x)
[ 0 1 2 3 4 5 6 7 8 9 10 11]
>>> print(y)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
>>> x.resize(2,6)
>>> print(x)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
-1
表示自动规划某一轴的尺寸,例如
>>> x.reshape(3,-1)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
则flatten
和ravel
相当于reshape(-1)
,即将数组展平为一维数组。
squeeze
则比flatten
稍微温和一点,会删除尺寸为1的维度,例如
>>> x.resize(1,3,4,1,1)
>>> print(x)
[[[[[ 0]]
[[ 1]]
[[ 2]]
[[ 3]]]
[[[ 4]]
[[ 5]]
[[ 6]]
[[ 7]]]
[[[ 8]]
[[ 9]]
[[10]]
[[11]]]]]
上面的这个x
有太多层括号,看上去毫无卵用,这个时候可以用squeeze
,
>>> x.squeeze()
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
有木有瞬间清爽了许多。
调整坐标轴
transpose
和swapaxes
用于调整坐标轴,如果用矩阵的视角去理解,那么大致相当于转置。
>>> x
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> x.T
array([[ 0, 6],
[ 1, 7],
[ 2, 8],
[ 3, 9],
[ 4, 10],
[ 5, 11]])
>>> x.transpose(1,0)
array([[ 0, 6],
[ 1, 7],
[ 2, 8],
[ 3, 9],
[ 4, 10],
[ 5, 11]])
其中,transpose(1,0)
表示将第一个坐标轴和第0个坐标轴交换位置。
牛刀小试
熟练掌握数组形状的变换方法,也就相当于熟悉了张量的运算法则,这对于数据科学来说是非常重要的基础技能。
例如,现有300张图像200x100的图像,想要得到每张图像的列质心。传统思路肯定是跑循环,但众所周知Python的循环效率比较慢,所以最佳方法是300张一起做,无非就是300x200x100的张量,对第二个坐标轴进行质心提取而已
imgs = np.random.rand(300,200,100)
xs = np.arange(100)
xCen = np.matmul(imgs, xs) / np.sum(imgs, axis=2)
其中,xCen
就是所要求的质心。
当然,也可以用更加直观的做法
xCen = imgs.reshape(-1,100)@xs / np.sum(imgs.reshape(-1,100), axis=1)
xCen = xCen.reshape(300,200)
Numpy函数
对于上面这几种数组的内置方法,有一些可直接从numpy中调用,这样的好处是可以直接对非数组格式的数据进行操作,例如
>>> x = list(range(12))
>>> np.reshape(x, (3,4))
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
其中,x
是一个列表,np.reshape
会自动将其转化为数组后再行操作。
同样地,flatten
也可以完成数组展平的任务
>>> x = [[i, i+1] for i in range(5)]
>>> x
[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5]]
>>> np.ravel(x)
array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])
来源:https://tinycool.blog.csdn.net/article/details/128343298
0
投稿
猜你喜欢
- K-Means聚类算法演示及可视化展示#导入包from sklearn.cluster import KMeansX = [[0.0888,
- 例如:JSON字符串:var str1 = '{ "name": "cxh", "
- 至此,我们的 Python零基础入门篇 的系列专栏到今天基本上算是结束了。今天没有任何的知识点,只是运用我们之前学习过的知识做两个小游戏的案
- 记得之前learn python一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下 最简单的写法class MyC
- 关于Ajax在使用中要使浏览器产生前进后退的方法,网上比较多的方法有两种:一是采用hash值的方式,这是我们在地图preview版中使用的方
- 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的
- 使用Tkinter模块来创建简单的GUI程序。Tkinter的Widgets有:Button、Canvas、Checkbutton、Entr
- 想到TDE(Transparent Data Encryption)。 TDE MSDN 说明: “透明数据加密”(TDE) 可对数据和日志
- 占位符说明1、%c,格式化字符及其ASCII码2、%s,格式化字符串3、%d,格式化整数4、%u,格式化无符号整数5、%o,格式化无符号八进
- 通过界面设计上是能手工操作的,无法达到我批量修改几千台服务器。 因为此了一个脚本来批量执行。 环境:redgate + mssql 2008
- 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下:两个要点:1、公历转农历用了查表法(第126
- JSON格式数据简介JSON 全称“JavaScript Object Notation”,译为&a
- 什么是迭代器能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器。表示为Iterator,迭代器是一个对象类型数据。概念迭代器指的
- 1、装饰器装饰器(Decorator):从字面上理解,就是装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限
- readlines的帮助信息>>> fr=open('readme.txt')>>> h
- 一、原因:今天在尝试初始化一个WEB应用的时候,发现其连接不上MySQL,从Traceback看到使用的默认密码为‘YES’。没辙,居然尝试
- 本文实例讲述了Python队列RabbitMQ 使用方法。分享给大家供大家参考,具体如下:目前的exchange的路由策略是:每个需要队列的
- juypter notebook中直接使用log_device_placement=True打印不出来device信息# Creates a
- 前言内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户
- 1、生成数据集(双月数据集)class moon_data_class(object): def __init__