科学计算库NumPy
目录一. 简单介绍
- NumPy是Python开源的数值计算扩展工具,它提供了Python对多维数组的支持,能够支持高级的维度数组与矩阵运算。此外,针对数组运算也提供了大量的数学函数库。NumPy是大部分Python科学计算的基础,它具有以下功能:
- 快速高效的多维数据对象ndarray。
- 高性能科学计算和数据分析的基础包。
- 多维数组(矩阵)具有矢量运算能力,快速且节省空间。
- 矩阵运算。无需循环即可完成类似Matlab中的矢量运算。
- 线性代数、随机数生成以及傅里叶变换功能。
二. 认识NumPy数组对象
-
NumPy中最重要的一个特点就是其N维数组对象,即ndarray(别名array)对象,该对象具有矢量算术能力和复杂的广播能力,可以执行一些科学计算。不同于Python标准库,ndarray对象拥有对高维数组的处理能力,这也是数值计算中缺一不可的重要特性。
-
ndrray对象中定义了一些重要的属性:
属性 具体说明 ndarray.ndim 维度个数, 也就是数组轴的个数 ndarray.shape 数组的维数, 就是一个整数的元组, 表示每个维度上的数组大小 ndarray.size 数组元素得总个数, 等于shape属性中元祖元素得乘积 ndarray.dtype 描述数组中元素类型的对象, 即可以使用标准库的Python类型创建和指定, 也可以使用NumPy特有的数据类型来指定 ndarray.itemsize 数组中每个元素的字节大小 -
注意: ndarray对象中储存的元素的类型必须是相同的
-
ndarray对象的使用实例:
arange()
函数是生成一系列的数字元素的数组,reshape()
函数是重组数组的行数, 列数, 维度
三. 创建NumPy数组
-
创建NumPy对象的方式有若干种, 其中最简单的就是使用
array()
函数, 在调用该函数时传入一个Python现有的类型即可 -
通过
zeros()
函数创建元素值都为0的数组 -
通过
ones()
函数创建元素值都是1的数组
-
通过
empty()
函数创建一个新的数组, 该数组只分配了内存空间, 它填充的元素是随机的, 类型为float64
-
通过
arange()
函数可以创建一个等差数组, 它的功能类似于range()
, 只不过arange()
函数返回的是数组, 而不是列表 -
可以看出来有点数字后边会有小数点
.
有的没有, 这算是因为元素数据类型不相同所导致的 -
创建
ndarray
对象时, 可以指定其元素的类型
四. ndarray对象的数据类型
1. 查看数据类型
-
通过
ndarray.dtype
可以创建一个表示数据的对象, 想要获取数据类型的名称, 则需要访问name
属性进行获取 -
NumPy的数据类型是有一个类型名和元素位长的数字组成的
-
NumPy中常见的数据类型:
-
每一个NumPy内置的数据类型都有一个特征码, 它能唯一标识一种数据类型
2. 转换数据类型
- ndarray对象的2数据类型可以通过
astype()
方法进行转换
五. 数组运算
- NumPy数组不需要循环遍历,即可对每个元素执行批量的算术运算操作,这个过程叫做矢量化运算。不过,如果两个数组的大小(ndarray.shape)不同,则它们进行算术运算时会出现广播机制。除此之外,数组还支持使用算术运算符与标量进行运算。
1. 矢量化运算
-
在NumPy中, 大小相同的数组之间的任何算术运算都会应用到元素级, 即只用于位置相同的元素之间, 所得到的运算结果组成一个新的数组
2. 数组广播
-
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量化运算了。
-
数组广播机制:
-
注意:广播机制实现了对两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。
- 数组的某一维度等长。
- 其中一个数组的某一维度为1。
-
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
3. 数组与标量之间的运算
- 数组与标量之间的运算会将那个表量传播到各个元素。标量运算会产生一个与数组具有相同数量的行和列的新矩阵, 其原来矩阵的每个元素被相做运算
六. ndarray的索引和切片
1. 整数索引和切片的基本使用
-
ndarray对象的元素可以通过索引和切片来访问和使用, 就像Python内置的容器对象一样
-
对于多维数组来说索引和切片的使用方式就不一样了(就是二维/多维数组的索引或切片使用)
2. 花式索引的基本使用
-
花式索引是NumPy的一个术语,是指将整数数组或列表作为索引,然后根据索引数组或索引列表的每个元素作为目标数组的下标再进行取值。
-
当使用一维数组或列表作为索引时,如果使用索引要操作的目标对象是一维数组,则获取的结果是对应下标的元素;如果要操作的目标对象是一个二维数组,则获取的结果就是对应下标的一行数据。
3. 布尔型索引的基本使用
-
布尔型索引指的是将一个布尔数组作为数组索引, 返回数据是布尔数组中
True
对应的位置 -
我们还可以将布尔型索引数组跟切片混合使用
-
注意: 除了可以使用
==
运算符还可以使用!=
,和-
来否定, 也可以使用&
和|
等符号来组合多个布尔条件
七. 数组的转置和轴对称
- 数组的转置是指将数组中的每个元素按照一定的规律进行位置变换
-
T 属性 : 对数组进行轴对换(行变列, 列边行)
-
transpose()
方法 : 需要得到一个由轴编号组成的元组才能对这些轴进行转置transpose()
方法的默认值为(2, 1, 0), 即直接调用不加参数
-
-
swapaxes()
方法 : 只转换其中的两个轴
- 在NumPy中维度(dimensions)叫做轴(axes), 轴的个数叫做秩(rank), 例如 在3D空间中有个点的坐标[1, 2, 1]是一个秩为 1 的数组, 因为他只有一个轴, 这个轴有三个元素, 所以说它的长度为 3
八. NumPy通用函数
- 在NUmPy,提供了诸如“sin”、“cos”和“exp”等常见的数学函数,这些函数叫做通用函数(ufnc)。通用函数是一种针对ndarray中的数据执行元素级运算的函数,函数返回的是一个新的数组。通常情况下,我们将ufunc中接收一个数组参数的函数称为一元通用函数,而接收两个数组参数的则称为二元通用函数。
- 常见一元通用函数 :
- 常见的二元通用函数 :
九. 利用NumPy数组进行数据处理
1. 将条件逻辑转化为数组运算
-
NumPy的
where()
函数是三元表达式x if condition else y
的矢量化版本 -
where()
函数- 参数一: 要判断的条件, 可以是一个布尔值, 可以使一个数组
- 参数二: 条件成立时获取arr1相应位置的值
- 参数三 : 当不满足条件时, 获取arr2相对位置的值
- 返回值: 一个新数组
2. 数组统计运算
-
NumPy数组中与统计运算相关的方法
方法 描述 sum 对数组中全部或是某个轴的元素进行求和 mean 算数平均值 min 计算数组中的最小值 max 计算数组中的最大值 argmin 表示最小值的索引 argmax 表示最大值得的索引 cumsum 所有元素的累计和 cumprod 所有元素的累计差 注意: 使用ndarray对象调用方法cumsum()和cumprod()方法后, 会产生一个结果是一个由中间结果组成的数组
3. 数组排序
-
对数组中的元素进行排序, 可以通过
sort()
方法实现sort()
方法对原数组进行了排序
-
对一个轴上的元素进行排序
4. 检索数组元素
- 在NumPy中,
all()
函数用于判断整个数组中的元素的值是否全部满足条件, 如果满足条件则会返回True, 否则返回False - 在NumPy中,
any()
函数用于判断整个数组中的元素至少有一个满足条件就返回True, 否则返回False
5. 唯一化及其他集合逻辑
-
针对一维数组, NumPy提供了
unique()
函数来找出数组中的唯一值, 并返回排序后的结果 -
in1d()
函数用于判断数组中的元素是否在另一个数组中中存在, 该函数返回的是一个布尔型数组-
注意:
in1d()
中的1
是数字1
-
-
数组集合运算的常见函数
函 数 描 述 nuique(x) 计算x中的元素, 并返回有序结果 intersect1d(x, y) 计算x与y中的公共元素, 并返回有序结果 union1d(x, y) 计算x与y的并集, 并返回有序结合 in1d(x, y) 得到一个"x的元素是否包含y"的布尔型数组 setdiff1d(x, y) 集合的差, 即元素在x中且不再y中 setxor1d(x, y) 集合的对称差, 即存在一个数组中的但不同时存在于两个数组中的元素
十. 线性代数模块
-
线性代数是数学运算中的一个重要工具,它在图形信号处理、音频信号处理中起非常重要的作用。
numpy.linalg
模块中有一组标准的矩阵分解运算以及诸如逆和行列式之类的东西。例如,矩阵相乘,如果通过“*” 对两个数组相乘,得到的是一个 元素级的积, 而不是一个矩阵点积。 -
NumPy中提供了一个用于矩阵乘法的
dot()
方法 -
linalg模块的常见函数
函数 | 描述 |
---|---|
dot | 矩阵乘法 |
diag | 以一维数组的形式返回方阵的对角线, 或将一维数组转化为方阵 |
trace | 计算对角线元素和 |
det | 计算矩阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方针的逆 |
qr | 计算qr分解 |
svd | 计算奇异值(SVD) |
solve | 解线性方程组 $Ax=b$,其中$A$是一个方阵 |
lstsq | 计算$Ax=b$的最小二乘解 |
十一. 随机数模块
-
与Python的random模块相比, NumPy的random模块功能更多, 它增加了一些可以高效生成多种概率分布的样本值得函数
-
random模块的常见函数
函数 描述 seed 生成随机种子 rand 产生均匀分布的样本值 randint 从给定的上下限范围内随机选取整数 normal 产生正态分布的样本值 beta 产生Beta分布的样本值 uniform 产生[0, 1]中的均匀分布的样本值