浅谈numpy中函数resize与reshape,ravel与flatten的区别


Posted in Python onJune 18, 2020

这两组函数中区别很是类似,都是一个不改变之前的数组,一个改变数组本身

resize和reshape

>>> import numpy as np
>>> a = np.arange(20).reshape(4,5)
>>> a
array([[ 0, 1, 2, 3, 4],
 [ 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19]])
>>> a.reshape(2,10)
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
>>> a
array([[ 0, 1, 2, 3, 4],
 [ 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19]])
>>> a.resize(2,10)
>>> a
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

两个函数都是改变数组的形状,但是resize是在本身上进行操作,reshape返回的是修改之后的参数

ravel和flatten

两者都可以将数组转换为一个维,

flatten(order='C')

参数:{‘C',‘F',‘A',‘K'}

默认情况下‘C'以行为主的顺序展开,‘F'(Fortran风格)意味着以列的顺序展开,‘A'表示如果a在内存中为Fortran连续,则按列展开,否则以行展开,‘K'按照元素在内存中出现的顺序展平a。

>>> a = np.arange(6).reshape(2,3)
>>> a.flatten()
array([0, 1, 2, 3, 4, 5])
>>> a.ravel()
array([0, 1, 2, 3, 4, 5])
>>> a.flatten('F')
array([0, 3, 1, 4, 2, 5])
>>> a.ravel('F')
array([0, 3, 1, 4, 2, 5])
>>>
>>> x = np.array([[1,2],[3,4]])
>>> a = np.arange(6).reshape(2,3)
>>> a.flatten()[...] = 1
>>> a
array([[0, 1, 2],
 [3, 4, 5]])
>>> a.ravel()[...] = 1
>>> a
array([[1, 1, 1],
 [1, 1, 1]])
>>>

flatten不会影响原始矩阵,返回的是一个副本,但是ravel是会修改数组

补充知识:【Numpy】维度变化reshape、ravel、flatten、transpose、resize、swapaxes

0. 首先,创建一个多维数组

from numpy import *
a = arange(24)

得到:

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

1.reshape 函数

b = a.reshape(2,3,4)
print(b)

得到一个 2*3*4 维的数组:

[[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]
 
 [[12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]]

可以想象成2层小洋楼,每层有 3*4 个房间

2.ravel函数 可以将多维数组展平(也就是变回一维)

c = b.ravel()
print(c)

得到一维数组

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

3.flatten函数 也是将多维数组展平,与ravel函数的功能相同,不过flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图(view)

c = b.flatten()
print(c)

得到一维数组

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

4.用元组设置维度

直接用一个正整数元组来设置数组的维度

b.shape = (6,4)
print(b)

这种做法将直接改变所操作的数组,现在数组b变成了一个 6*4 的多维数组

[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]

5.transpose函数 将矩阵进行转置

d = b.transpose()
print(d)

得到 4*6 的多维数组

[[ 0 4 8 12 16 20]
 [ 1 5 9 13 17 21]
 [ 2 6 10 14 18 22]
 [ 3 7 11 15 19 23]]

6.transpose函数 将矩阵按照设定维度变换顺序

b = a.reshape(2,3,4)
c = b.transpose((2,1,0))
print(c)

得到一个形状为4*3*2的数组:

array([[[ 0, 12],
 [ 4, 16],
 [ 8, 20]],
 [[ 1, 13],
 [ 5, 17],
 [ 9, 21]],
 [[ 2, 14],
 [ 6, 18],
 [10, 22]],
 [[ 3, 15],
 [ 7, 19],
 [11, 23]]])

7.resize函数和reshape函数的功能一样,但resize会直接修改所操作的数组

b.resize((2,12))
print(b)

得到 2*12 的两维数组

[[ 0 1 2 3 4 5 6 7 8 9 10 11]
[12 13 14 15 16 17 18 19 20 21 22 23]]

并且这一步不可以通过赋值来实现,如下所示:

e = b.resize((2,12))
print(e)

此时结果为:

None

8.swapaxes(ax1,ax2) : 将数组n个维度中两个维度进行调换,不改变原数组

b = a.reshape(2,3,4)
c = b.swapaxes(0,2)
print(c)

得到一个形状为4*3*2的数组(可以和6.transpose函数进行比较来看):

array([[[ 0, 12],
 [ 4, 16],
 [ 8, 20]],
 [[ 1, 13],
 [ 5, 17],
 [ 9, 21]],
 [[ 2, 14],
 [ 6, 18],
 [10, 22]],
 [[ 3, 15],
 [ 7, 19],
 [11, 23]]])

以上这篇浅谈numpy中函数resize与reshape,ravel与flatten的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python错误处理详解
Sep 28 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
简单实现python收发邮件功能
Jan 05 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
python名片管理系统开发
Jun 18 #Python
一文轻松掌握python语言命名规范规则
Jun 18 #Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 #Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 #Python
Python Switch Case三种实现方法代码实例
Jun 18 #Python
Python3开发环境搭建详细教程
Jun 18 #Python
Python collections.defaultdict模块用法详解
Jun 18 #Python
You might like
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Python中按值来获取指定的键
2019/03/04 Python
python处理“
2019/06/10 Python
Python 变量的创建过程详解
2019/09/02 Python
使用python制作一个解压缩软件
2019/11/13 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
Java多态性的定义以及类型
2014/09/16 面试题
先进集体获奖感言
2014/02/13 职场文书
安全横幅标语
2014/06/09 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
搞笑婚前保证书
2015/02/28 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android