改变numpy的大小_Numpy入门详细教程

序言:python数据科学基础库主要是三剑客:numpy,pandas以及matplotlib,每个库都集成了大量的方法接口,配合使用功能强大。平时虽然一直在用,也看过很多教程,但纸上得来终觉浅,还是需要自己系统梳理总结才能印象深刻。本篇先从numpy开始,对numpy常用的方法进行思维导图式梳理,多数方法仅拉单列表,部分接口辅以解释说明及代码案例。最后分享了个人关于axis和广播机制的理解。

854b4ddb7eebb64252f1e6bf122151d7.png

01 基本介绍

numpy:numerical python缩写,提供了底层基于C语言实现的数值计算库,与python内置的list和array数据结构相比,其支持更加规范的数据类型和极其丰富的操作接口,速度也更快。

numpy的两个重要对象是ndarray和ufunc,其中前者是数据结构的基础,后者是接口方法的基础。

ufunc,通函数,其意义是可以像执行标量运算一样执行数组运算,本质即是通过隐式的循环对各个位置依次进行标量运算。只不过这里的隐式循环交由底层C语言实现,因此相比直接用python循环实现,ufunc语法更为简洁、效率更为高效。

索引、迭代和切片操作方式与普通列表比较类似,但是支持更为强大的bool索引。

这部分内容比较基础,仅补充一个个人认为比较有用的ufunc加聚合的例子。ufunc本身属于方法(方法即是类内的函数接口),ufunc之上还支持4个方法:

  • reduce,聚合方法
  • accumulate,累计聚合
  • reduceat,按指定轴向、指定切片聚合
  • outer:外积

当然,后两个用处较少也不易理解,前两个在有些场景下则比较有用:

5de174f0d1d07d9405bde78aa76612d7.png

02 数组创建

d63d06bef2a1748d8eae67f0a1bb5a0f.png

numpy中支持5类创建数组的方式:

  • 从普通数据结构创建,如列表、元组等
  • 从特定的array结构创建,支持大量方法,例如ones、zeros、empty等等
    • empty接收指定大小创建空数组,这里空数组的意义在于未进行数值初始赋值,随机产生,因而速度要更快一些
    • linspace和arange功能类似,前者创建指定个数的数值,后者按固定步长创建,其中linspace默认包含终点值(可以通过endpoint参数设置为false),而arange则不含终点
  • 从磁盘读取特定的文件格式
  • 从缓存或字符读入数组
  • 从特定的库函数创建,例如random随机数包

以上方法中,最为常用的是方法1、2、5。

03 数组增删

0a4b7e8edc9d1907de196ec7d6edcf64.png

numpy提供了与列表类似的增删操作,其中

  • append是在指定维度后面拼接数据,要求相应维度大小匹配
  • insert可以在指定维度任意位置插入数据,要求维度大小匹配
  • delete删除指定维度下的特定索引对应数据

4c3bc1ba8612ec1e2f0a0ebd65b6a5e6.png

三种方法需要接收一个axis参数,如果未指定,则均会先对目标数组展平至一维数组后再执行相应操作。

04 数组变形

数组变形是指对给定数组重新整合各维度大小的过程,numpy封装了4类基本的变形操作:转置、展平、尺寸重整和复制。主要方法接口如下:

ed2b2d6ab014d39c7d2a478f34be5c06.png
  • reshape常用于对给定数组指定维度大小,原数组不变,返回一个具有新形状的新数组;如果想对原数组执行inplace变形操作,则可以直接指定其形状为合适维度

397dcd45ffce6374bbc8f4cce79ed86a.png
  • resize与reshape功能类似,主要有3点区别:
    • resize面向对象操作时,执行inplace操作,调用np.resize类方法时则不改变原数组形状;而reshape无论如何都不改变原数组形状
    • resize变形后的数组大小可以不和原数组一致,会自动根据新尺寸情况进行截断或拼接
    • 正因为resize可以执行截断,所以要求接收确切的尺寸参数,不允许出现-1这样的"非法"数值;而reshape中常用-1的技巧实现某一维度的自动计算

另外,当resize新尺寸参数与原数组大小不一致时,要求操作对象具有原数组的,而不能是view或简单赋值。(具体参考08 视图与拷贝一节)

  • ravel和flat功能类似,均返回对数组执行展平后的结果,且不改变原数组形状,区别在于:
    • 前者是方法接口,而后者是属性接口,
    • 前者返回对象类型仍然是数组,而后者返回对象类型是专用的flatten类型,一般用作迭代器对象
  • transpose与T均执行转置操作,前者是方法,后者是属性
  • tile和repeat方法类似,均为对给定数组执行复制操作,区别在于:
    • tile面向整个数组复制,而repeat面向数组元素复制
    • tile不接收维度参数,而repeat需指定维度参数,否则会对数组先展平再复制

410cd967c8923e0d8dd185a0d36567fa.png

05 数组拼接

b93cb0dc0e4145bab9121a4ff8182f06.png

数组拼接也是常用操作之一,主要有3类接口:

  • concatenate,对给定的多个数组按某一轴进行拼接,要求所有数组具有相同的维度(ndim相等)、且在非拼接轴大小一致
  • stack系列,共6个方法:
    • hstack,column_stack:功能基本一致,均为水平堆叠(axis=1),或者说按列堆叠。唯一的区别在于在处理一维数组时:hstack按axis=0堆叠,且不要求两个一维数组长度一致,堆叠后仍然是一个一维数组;而column_stack则会自动将两个一维数组变形为Nx1的二维数组,并仍然按axis=1堆叠,自然也就要求二者长度一致,堆叠后是一个Nx2的二维数组
    • vstack,row_stack,功能一致,均为垂直堆叠,或者说按行堆叠,axis=0
    • dstack,主要面向三维数组,执行axis=2方向堆叠,输入数组不足3维时会首先转换为3维,主要适用于图像处理等领域
    • stack,进行升维堆叠,执行效果与前几种堆叠方式基本不同,要求所有数组必须具有相同尺寸。堆叠后,一维变二维、二维变三维……
  • 魔法方法:r_[ ],c_[ ],效果分别与row_stack和column_stack类似,但具体语法要求略有不同。另外,虽然不是函数,但第一个参数可以是一个字符串实现特定功能设置。

06 数组切分

492a1cc1824937ef3ac93f55614072c8.png

数组切分可以看做是数组拼接的逆操作,分别对应:

  • hsplit:水平切分,要求切分后大小相等,维数不变,可以切分一维数组
  • vsplit:垂直切分,要求切分后大小相等,维数不变,要求至少二维以上
  • dsplit:纵深切分,要求切分后大小相等,维数不变,至少三维数组
  • split:通过接收一个axis参数实现任意切分,默认axis=0,若设置axis=1或2则可分别实现vstack和dstack
  • array_split:前面4个方法均要求实现相同大小的子数组切分,当切分份数无法实现整除时会报错。array_split则可以适用于近似相等条件下的切分,也接受一个axis参数实现指定轴向

07 基本统计量

231e8ae1fa533fc0d2d45e48786cd815.png

numpy可以很方便的实现基本统计量,而且每种方法均包括对象方法和类方法:

  • max,argmax分别返回最大值和最大值对应索引,可接收一个axis参数,指定轴线的聚合统计。对于二维及以上数组,若不指定axis,即axis=None,此时对数组所有数值求聚合统计
  • min,argmin,与最大一致
  • mean、std,分别求均值和标准差,也可接收一个缺省参数axis实现特定轴向聚合统计或全局聚合
  • var、cov,分别求方差和协方差,与均值标准差类似
  • sort、argsort,分别返回排序后的数组和相应索引,接收一个axis参数,默认为axis=-1,按最后一个轴向,若axis=None表示先展平成一维数组后再排序;另外可设置排序算法,如快排、堆排或归并等

08 视图与拷贝

ea15703dca84f12e2b0420529f463756.png

与列表的操作类似,numpy的数组类型也存在深浅拷贝之分:

  • 直接赋值:无拷贝,相当于是引用
  • view():建立视图,浅拷贝,形状可以不一致,但数据相同
  • copy():深拷贝,完全独立的对象

cef1e8ec85be6c22798d05fd4a718457.png

注:正因为赋值和view操作后两个数组的数据共享,所以在前面resize试图更改数组形状时可以执行、但更改元素个数时会报错。

09 特殊常量

c7d78176b9f8b28712d2548678620fe4.png

numpy提供了一些特殊的常量,值得注意的是np.newaxis可以用作是对数组执行升维操作,效果与设置为None一致。

10 随机数包

e0498cff17c08bb1f88183df6fabbc1e.png

Random是numpy下的一个子包,内置了大量的随机数方法接口,包括绝大部分概率分布接口,常用的主要还是均匀分布和正态分布:

  • 均匀分布:random、rand、uniform,三者功能具有相似性,其中前两者均产生指定个数的0-1之间均匀分布,而uniform可通过设置参数实现任意区间的均匀分布;当需要产生整数均匀分布时,可用randint

4befd4e6bbab5f19daaf3affcc39efc6.png
  • 正态分布:randn,normal,前者生成标准正态分布(均值为0,方差为1),后者产生任意正态分布,接收一个loc参数作为均值,scale参数作为标准差
  • permutation、shuffle,对给定序列实现随机排列,前者返回一个新数组,后者是inplace操作
  • seed,因为计算机中的随机数严格讲都是伪随机,需要依赖一个随机数种子来不断生成新的随机数,seed可以用于固定这个随机种子。当指定随机数种子后,后续的随机将得到固化

11 线性代数包

d654ffcf35543de7ad8ac96a25db69d1.png

除了随机数包,numpy下的另一个常用包是线性代数包,常见的矩阵操作均位于此包下。由于点积dot()和向量点积vdot()操作使用较为频繁,所以全局可用。

12 关于axis的理解

由于numpy的基本数据结构是多维数组,很多接口方法均存在维度的问题,按照不同维度执行操作结果往往不同,例如拼接、拆分、聚合统计等,此时一般需要设置一个维度参数,即axis。由于很多教程因为翻译或语言习惯不同,存在众说纷纭、口径不一的问题,有的说axis=0是横轴,有的说是纵向,所以如何理解axis的含义可能是很多numpy初学者的常见困扰之一,笔者也是如此。

这一问题困扰了好久,直至一次无意间看到了相关源码中的注释:

c554954b907d5c299dc3db7c9effd49f.png

例如,在sort方法中,axis参数的解释为"Axis along which to sort",翻译过来就是沿着某一轴执行排序。这里的沿着一词用得恰到好处,形象的描述了参数axis的作用,即相关操作是如何与轴向建立联系的,在具体解释之前,先介绍下axis从小到大的顺序问题。axis从小到大对应轴的出场顺序先后,或者说变化快慢:axis=0对应主轴,沿着行变化的方向,可以理解为在多重for循环中最外面的一层,对应行坐标,数值变化最慢;而axis=1对应次轴,沿着列变化的方向,在多重for循环中变化要快于axis=0的轴向。类似地,如果有更高维度则依次递增。

至此,再来理解这里axis沿着的意义。举个例子,axis=0代表沿着行变化的方向,那么自然地,切分方法split(axis=0)接口对应vsplit,因为是对行切分,即垂直切分;而split(axis=1)接口则对应hsplit,因为是对列切分,即水平切分;split(axis=2)则对应dsplit。类似的,np.sort(axis=0)必然是沿着行方向排序,也就是分别对每一列执行排序。想必这样理解,应该不会存在混淆了。

13 关于广播机制

可能困扰numpy初学者的另一个用法是numpy的一大利器:广播机制。广播机制是指执行ufunc方法(即对应位置元素1对1执行标量运算)时,可以确保在数组间形状不完全相同时也可以自动的通过广播机制扩散到相同形状,进而执行相应的ufunc方法。当然,这里的广播机制是有条件的:

54ae60f4025e32b739a24909f7f076b9.png

条件很简单,即从两个数组的最后维度开始比较,如果该维度满足维度相等或者其中一个大小为1,则可以实现广播。当然,维度相等时相当于未广播,所以严格的说广播仅适用于某一维度从1广播到N;如果当前维度满足广播要求,则同时前移一个维度继续比较。为了直观理解这个广播条件,举个例子,下面的情况均满足广播条件:

f71ea8a6aa7d1bdf1966f813d2d6529c.png

而如下例子则无法完成广播:

61ede40a6732e81d475a88f64f22ce8b.png

好吧,以上例子其实都源自numpy官方文档。具体可参考../numpy/doc/Broadcasting.py文件。另外,doc包下还包括很多说明文档,对于深刻理解numpy运行机制大有裨益。

再补充一句:这里或许有人好奇,为什么必须要1对N才能广播,N的任意因数(比如N/2、N/3等)不是都可以"合理"广播到N吗?对此,个人也曾有此困惑,我的理解是这里的合理只是数学意义下的合理,但数组表征值意义下往往不合理,因为缺乏解释性!比如2可以广播到12,但此时该怎样理解这其中的广播意义呢?奇偶不同?那3广播到12呢?4广播到12呢?还是欠缺解释性。所以numpy限制必须是1广播到N或者二者相等,才可以广播。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九年级数学解方程50道_初中数学公式中考知识点总结,初三数学上册,九年级数学上册...

初中数学公式中考知识点总结,初三数学上册,九年级数学上册第二十一章 一元二次方程知识点:一元二次方程的解法1、直接开平方法利用平方根的定义直接开平方求一元二次方程的解的方法叫做直接开平方法,2、配方法配方法是一种重要的数…

java时间规划书_【计算机本科补全计划】Java学习笔记(九) Java日期时间

正文之前终于好像仿佛看完了菜鸟教程的Java课程,感觉自己收获颇丰!很好,Java看完之后正愁如何开始进阶呢!结果发现菜鸟还准备了Java实例这种好东西!简直就是教程界的良心啊 !!!没事&…

与40mhz信道不兼容设置_为什么面包板不适合高频电路

01为什么在面包板上玩射频?方便,当然还是方便。面包板是进行一些电子线路实验构建电路方便的平台。多用于普通数字电路和模拟电路。一旦涉及到高频电路,面面包就有很多方面不太适合了。那么到底哪方面不适合?对于高频信号在面包板…

加载gif_搞笑gif:这啥情况啊?笑容加载不出来了?

这无故的小眼神,我也很无奈呀。。。猫和狗对峙,气势上一定不能输几个菜呀,喝成这样!这啥情况啊?笑容加载不出来了?高手在民间!小青年瞬间变老头!丈母娘来家了,说下班就能…

排序千万级数据_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...

千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议。从一开始脑海里开始也是火光四现&…

java读取rvt文件数据_Revit二次开发之隐藏API 独立进程读取rvt文件

在项目中需要读取rvt文件,但是因为该格式为非公开格式,其数据需要revit的支持,但批量读取不可能一个一个用revit软件去打开。不过该方法还是需要revit的依赖,速度比开软件快了知道多少1.1. 新建一个控制台项目1.2. 添加Revit API引…

java类快速构造_程序员有什么办法能快速梳理java知识点?有这八张图就够了

一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。1、字符串不变性下面这张图展示了这段代码做了什么String s "abcd";s s.concat(&quo…

uos配置 java 环境变量_CentOS 7.3 环境配置java和tomcat开机启动

Centos7下添加开机自启动服务和脚本 https://blog.csdn.net/GMingZhou/article/details/78677953安装部分参考我的博文,仅参考他的开机启动部分CentOS 7环境配置tomcat7开机启动 https://blog.csdn.net/tiantang_1986/article/details/537049661.安装 jdk-8u5-lin…

react全局方法_前端面试题 ---react

高阶组件相关什么是高阶组件,它有哪些运用?高阶组件就是一个函数,接收一个组件,经过处理后返回后的新的组件;高阶组件,不是真正意义上的组件,其实是一种模式;可以对逻辑代码进行抽离…

get方法请求返回一个文件_一键转换多种文件格式,完全免费,总有一个方法适合你...

相信各位小伙伴平时办公的时候,肯定经常需要对多种文件格式进行转换,但是下面这些非常好用的转换方法,你用过吗?接下来就带各位一探究竟,希望可以帮到你哦!一、迅捷PDF转换器在线版1、文档转换首先我们可以…

jacoco入门_Android jacoco 代码覆盖率测试入门

前言最近同事搞了一个基于 jacoco 统计 Android 代码覆盖率测试的功能,可以统计每天手工测试的代码覆盖率.抱着好奇的心态,自己也学习一下 jacoco,陆陆续续搞了三天终于有点结果了.本文介绍仅仅在源码中加入少量代码就可以完成代码覆盖率覆测试.代码配置build.gradle在 app 目录…

uinty粒子系统子物体变大_Unity的粒子系统(一)基础篇

简介闲来无事,仔细的学习一下粒子系统,也当是给自己做个笔记方便之后进行回顾。引擎版本:Unity2018.3创建一个ParticleSystem创建方式:1、Hierarchy-->Effects-->ParticleSystem第一种创建方式创建结果2、gameObject-->A…

java定义返回码常量_码出规范(四)常量定义

01各位屏幕前的读者朋友大家早上中午晚上凌晨好,本文是《码出规范》专题的第四篇,文中参考阿里巴巴最新发布的《Java开发手册》,结合《springboot2.x独门秘籍》专题中的项目开发进度,学以致用,让你在开发中码出高效&am…

centos下载mysql_python数据分析之路——centos下载并配置mysql与navicat的使用

python数据分析之路——centos下载并配置mysql与navicat的使用在之前的文章中已经说明了如何购买并配置一台自己的服务器,那么在安装完anaconda之后,为了之后方便用Django进行网站开发与数据分析,需要对数据库进行配置,那么在数据…

mysql 解压缩安装_[mysql] MySQL解压缩安装步骤

以前装的MySQL出问题了,只好卸载了。又下载了一个mysql-5.6.24-win32.1432006610.zip。msi文件直接安装就行了。这里需要解压到指定目录,配置后可使用。环境变量配置:在 mysql根目录下修改 my-default.ini :# These are commonly set, remove…

mysql数据库如何创建表_mysql数据库如何创建数据表

mysql数据库创建数据表的方法是:可以通过CREATE TABLE语句来创建,基本语法:【CREATE TABLE ([表定义选项])[表选项][分区选项];】。要注意的是,创建数据表不能使用SQL语言中的关键字。在 MySQL 中,可以使用 CREATE TAB…

mysql 主从一致性_mysql 主从一致性保证

MySQL 主备的基本原理MySQL 主备切换流程.png主备同步流程图备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程,专门用于服务备库 B 的这个长连接。一个事务日志同步的完整过程是这样的:在备库 B 上通过 change master 命令,设置…

php study是什么,phpstudy与wamp区别的区别是什么?

phpstudyphpstudy是一个php运行环境的集成包,用户不需要去配置运行环境,就可以使用,phpstudy不仅是一款比较好用的php调试环境工具,并且还包括了开发工具和常用手册,对于新手是有很大帮助的。phpstudy集成最新的Apache…

java全局机制,java实现全局异常机制

先上自己的代码,后整理下原理知识。下面是自己实现的全局异常机制1.继承Exception,自定义异常类​package com.zichen.xhkq.exception;/**** Title: CustomException* Description: 系统自定义的异常类型,实际开发中可能要定义多种异常类型* authorCNZZ*…

mysql crash定位分析_MySQL实例crash的案例详细分析

【问题描述】我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21),不定期的会crash,但error log中只记录了重启信息,未记录crash时的堆栈:mysqld_safe Number of processes running now: 0mysqld_safe mysqld restarted接下来…