一、numpy库的介绍

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

二、numpy库的应用

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

SciPy 是一个开源的 Python 算法库和数学工具包。

SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。

三、numpy库的安装

1、使用已有的发行版本

对于许多用户,尤其是在 Windows 上,最简单的方法是下载以下的 Python 发行版,它们包含了所有的关键包(包括 NumPy,SciPy,matplotlib,IPython,SymPy 以及 Python 核心自带的其它包):

  • Anaconda: 免费 Python 发行版,用于进行大规模数据处理、预测分析,和科学计算,致力于简化包的管理和部署。支持 Linux, Windows 和 Mac 系统。
  • Enthought Canopy: 提供了免费和商业发行版。持 Linux, Windows 和 Mac 系统。
  • Python(x,y): 免费的 Python 发行版,包含了完整的 Python 语言开发包 及 Spyder IDE。支持 Windows,仅限 Python 2 版本。
  • WinPython: 另一个免费的 Python 发行版,包含科学计算包与 Spyder IDE。支持 Windows。
  • Pyzo: 基于 Anaconda 的免费发行版本及 IEP 的交互开发环境,超轻量级。 支持 Linux, Windows 和 Mac 系统。

2、使用 pip 安装

安装 NumPy 最简单的方法就是使用 pip 工具

pip3 install --user numpy scipy matplotlib

--user 选项可以设置只安装在当前的用户下,而不是写入到系统目录。

默认情况使用国外线路,国外太慢,我们使用清华的镜像就可以:

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

 友情提醒:具体的安装方法可自行百度

NumPy中最重要的一个特点就是其N维数组对象,即ndarray(别名array)对象,该对象可以执行一些科学计算。

ndarray对象中定义了一些重要的属性:

 

四、numpy创建数组的常用函数

1.array(创建数组)

 

2.zeros((n,m))和ones((n,m))(创建数组中的元素全为1或0)

其中n表示创建数组的行数,m表示列数

 3.empty((n,m))(创建一个元素为随机的数组)

4.arange(起始数,结尾数,步长) (创建等差数组)

五、ndarray对象的数据类型

ndarray.dtype可以创建一个表示数据类型的对象,如果希望获取数据类型的名称,则需要访问name属性进行获取。

NumPy的数据类型是由一个类型名和元素位长的数字组成。

通过zeros()、ones()、empty()函数创建的数组,默认的数据类型为float64。 默认情况下,64位windows系统输出的结果为int32, 64位Linux或macOS系统输出结果为int64,当然也可以通过dtype来指定数据类型的长度。

NumPy中常用的数据类型:

 

每一个NumPy内置的数据类型都有一个特征码,它能唯一标识一种数据类型。

 

ndarray对象的数据类型可以通过astype()方法进行转换。

 

六、numpy中数组的运算

1.数组运算可以分为以下三种:

(1)形状相同的数组(矢量化运算) 

(2)形状不同的数组(广播机制)

(3)数组与标量运算(标量) 

2.矢量化运算

形状相等的数组之间的任何算术运算都会应用到元素级,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组。

3.数组广播

当形状不相等的数组执行算术计算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量化运算了。

 

广播机制需要满足如下任意一个条件即可:

(1)两个数组的某一维度等长。

(2)其中一个数组为一维数组。 广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。 

4.数组与标量间的运算

七、ndarray的索引和切片 

对于一维数组来说,从表面上来看,它使用索引和切片的方式,与Python列表的功能相差不大。

对于多维数组来说,索引和切片的使用方式与列表就大不一样了,比如二维数组的索引方式如下:

 

在二维数组中,每个索引位置上的元素不再是一个标量了,而是一个一维数组。

 

如果想获取二维数组的单个元素,则需要通过形如“arr[x,y]”的索引来实现,其中x表示行号,y表示列号。

比如我想获取data9这个数组中5这个元素

 

多维数组的切片是沿着行或列的方向选取元素的,我们可以传入一个切片,也可以传入多个切片,还可以将切片与整数索引混合使用。

单个切片:

 

两个切片:

 

切片与整数索引混合使用:

 

花式索引是NumPy的一个术语,是指用整数数组或列表进行索引,然后再将数组或列表中的每个元素作为下标进行取值。

当使用一个数组或列表作为索引时,如果使用索引要操作的对象是一维数组,则获取的结果是对应下标的元素。

 

如果用两个花式索引操作数组,则会将第1个作为行索引,第2个作为列索引,以二维数组索引的方式选取其对应位置的元素。

 

 

八、数组的转置和轴对称

数组的转置指的是将数组中的每个元素按照一定的规则进行位置变换。

NumPy提供了两种实现方式: T属性 和 transpose()方法

简单的转置可以使用T属性,它其实就是进行轴对换而已。

当使用transpose()方法对数组的shape进行调换时,需要以元组的形式传入shape的编号。

如果我们不输入任何参数,直接调用transpose()方法,则其执行的效果就是将数组进行转置,作用等价于transpose(2,1,0)。

 

有时可能只需要转换其中的两个轴,这时可以使用swapaxes()方法实现,该方法需要接受一对轴编号,比如(1,0)。 

 补充:高维数据执行某些操作(如转置)时,需要指定维度编号,这个编号是从0开始的,然后依次递增1。其中,位于纵向的轴(y轴)的编号为0,位于横向的轴(x轴)的编号为1,以此类推。

九、numpy通用函数

通用函数(ufunc)是一种针对ndarray中的数据执行元素级运算的函数,函数返回的是一个新的数组。

我们将ufunc中接收一个数组参数的函数称为一元通用函数,接受两个数组参数的则称为二元通用函数

常见的一元通用函数如下表:

 

常见的二元通用函数如下表:

 

十、利用NumPy数组进行数据处理

NumPy的where()函数是三元表达式x if condition else y的矢量化版本。

 

类似于java中的三目运算符

数组统计运算:

 

 数组排序:

如果希望对NumPy数组中的元素进行排序,可以通过sort()方法实现。

如果希望对任何一列上的元素进行排序,则需要将列的编号作为sort()方法的参数传入。 

 

all()函数用于判断整个数组中的元素的值是否全部满足条件,如果满足条件返回True,否则返回False。

 

any()函数用于判断整个数组中的元素至少有一个满足条件就返回True,否则就返回False。

 

针对一维数组,NumPy提供了unique()函数来找出数组中的唯一值,并返回排序后的结果。

 

inld()函数用于判断数组中的元素是否在另一个数组中存在,该函数返回的是一个布尔型的数组。

 

其他函数的补充:

 

十一、线性代数模块

numpy.linalg模块中有一组标准的矩阵分解运算以及诸如逆和行列式之类的东西。

例如,矩阵相乘,如果我们通过“*”对两个数组相乘的话,得到的是一个元素级的积,而不是一个矩阵点积。

NumPy中提供了一个用于矩阵乘法的dot()方法。

 除此之外,linalg模块中还提供了其他很多有用的函数:

十二、随机数模块

与Python的random模块相比,NumPy的random模块功能更多,它增加了一些可以高效生成多种概率分布的样本值的函数。

 

除此之外,random模块中还包括了可以生成服从多种概率分布随机数的其它函数。

 

seed( )函数可以保证生成的随机数具有可预测性,也就是说产生的随机数相同。

当调用seed()函数时,如果传递给seed参数的值相同,则每次生成的随机数都是一样的。 当传递的参数值不同或者不传递参数时,则seed()函数的作用跟rand()函数相同,即多次生成随机数且每次生成的随机数都不同。 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐