第二章 Numpy基础
2.1 Numpy 简介
NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
- 一个强大的N 维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
为什么要使用NumPy?
- numpy 的数组功能比Python 自身的嵌套列表(nested list structure)结构要高效得多(该结构也可以用来表示矩阵(matrix)),支持大量得维度数组与矩阵运算,此外也针对数组运算提供大量得数学函数库
NumPy模块导入:
import numpy as np
from numpy import*
NumPy支持得数据类型
类型 | 描述 |
bool | 用一位存储的布尔类型(值为TRUE或FALSE) |
int | 由所在平台决定其精度的整数(一般为int32或int64) |
float | 浮点数,根据精度显示不同的长度 |
str | 字符串数据 |
… | … |
2.2 Numpy 数组创建及存储
2.2.1 数组函数
创建数组通常使用array函数
array函数详解:
numpy.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0)
-
object
:接收array。表示想要创建的数组。无默认 -
dtype
:接收data-type。表示数组所需的数据类型。如果未给定,则选择保存对象所需的最小类型。默认为None -
ndmin
:接收int。指定生成数组应该应该具有的最小维度。默认为None
查看数组的基本信息
函数 | 描述 |
size | 数组的大小 |
ndim | 数组最大维度 |
shape | 数组的形状 |
dtype | 数据类型 |
2.2.2 数组生成函数
arange函数
numpy.arange(start,stop,step,dtype=None)
-
start
:起始值。可忽略不写,默认从0开始 -
stop
:结束值。生成的元素不包括结束值 -
step
:步长。可忽略不写,默认步长为1 -
dtype
:设置显示元素的数据类型,默认为None
linspace 和 logspace 函数
numpy.linspace(start,stop,,num=50,endpoint=True,retstep=False,dtype=None,axis=0)
numpy.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None,axis=0)
-
endpoint
:True 则包括stop;false 则不包含stop -
retstep
:如果为True,则结果会给出数据间隔 -
base
:函数的底
2.2.3 简便的数组生成函数
函数名 | 描述 |
ones | 根据给定形状和数据类型生成全1数组 |
ones_like | 根据所给的数组生成一个形状一样的全1数组 |
zeros | 根据给定形状和数据类型生成全0数组 |
zeros_like | 根据所给的数组生成一个形状一样的全0数组 |
empty | 根据给定形状生成一个没有初始化的空数组 |
empty_like | 根据所给的数组生成一个形状一样但没有初始化数值的空数组 |
full | 根据给定形状和数据类型生成指定数值的数组 |
full_like | 根据所给的数组生成一个形状一样但内容是指定数值的数组 |
eye,identity | 生成一个N×N特征矩阵(对角线是1,其他是0) |
diag | 将一个方针对角元素作为一维数组返回,或者将一位数组转换成一个方针,并在非对角线上有零点 |
2.2.4 随机数模块
numpy.random
模块填补了Python内建的random模块的不足,可以搞笑生成随机数组
numpy.random.randiant(low,high=None,size=None,dtype='l')
-
low
:生成的数值最低要大于等于low,(high = None时,生成的数值要在[0,low)区间内) -
high
:如果使用这个值,则生成的数值在[low,high)区间 -
size
:输出随机数的尺寸,比如size=(m * n * k) 则输出同规模即m * n * k个随机数。默认是None的,仅仅返回满足要求的单一随机数
无约束条件下生成随机数
np.random.random(n)
- 生成n个(0,1)之间服从均匀分布的随机数,数据类型为float
np.random.random((m,n))
- 生成m维,每个数组n个(0,1)之间服从均匀分布的随机数,数据类型为float
Numpy随机数
函数 | 描述 |
random | 无约束条件下生成随机数 |
rand | 从均匀分布中抽取样本 |
randn | 从均值0方差1的正态分布中抽取样本 |
binomial | 产生二项分布的随机数 |
normal | 产生正态(高斯)分布的随机数 |
beta | 产生beta分布的随机数 |
chisquare | 产生卡方分布的随机数 |
gamma | 产生gamma分布的随机数 |
uniform | 产生[0,1)中均匀分布的随机数 |
seed | 确定随机数生成器的种子 |
permutation | 返回一个序列的随机排序或返回一个随机排序的范围 |
shuffle | 对一个序列进行随机排序 |
2.2.5 Numpy 数据的读写
NumPy文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式
-
np.save("../tmp/save_arr",arr)
//以二进制格式保存数据 -
np.load("../tmp/save_arr.npy")
//从二进制文件中读取数据 -
np.savez('../tmp/savez_arr',arr1,arr2)
//将多个数组保存到一个文件中
读取文本格式的数据
-
np.savetxt("../tmp/arr.txt",arr,fmt="%d",delimiter=",")
//将数组写到某种分隔符隔开的文本文件中 -
np.loadtxt("../tmp/arr.txt",delimiter=",")
//把文件加载到一个二维数组中 -
np.genfromtxt("../tmp/arr.txt",delimiter=",")
//genfromtxt函数面向的是结构化数组和缺失数据
2.3 Numpy 数组操作
2.3.1 数组索引与切片
一维数组
操作 | 描述 |
| 单个元素 |
| 连续多个元素 |
| 分散取多个元素 |
| 正向步长取值(j1 < j2) |
| 反向步长取值(j1 > j2) |
| 从末尾索引。正向检索规则同样适用负向 |
多维数组
操作 | 描述 |
| 单个元素 |
| 连续多个元素 |
| 分散取多个元素 |
| 正向步长取值(j1 < j2) |
| 反向步长取值(j1 > j2) |
| 整列操作 |
| 整行操作 |
2.3.2 布尔数组
对两个任意形状大小的数组进行比较运算可以获得一个相同形状的布尔数组
根据布尔值的特性,可以对布尔数组做多种操作
函数 | 描述 |
| 返回所有元素的和 |
| 检验数组中有没有true,如果有一个true,则返回true |
| 检验数组是不是全都是true,只有在全都是true的情况下才返回true |
利用布尔数组切片
布尔索引是把数组中布尔值为True的相应行、列或者元素抽取了出来(注意:布尔值的长度必须和想要切片的维度或轴的长度一致)
一维数组
一维数组中的每个元素的布尔型数值对一个与一维数组有着同样行数或列数的数组进行符合匹配
多维数组
提取行列:将行(列)对应布尔值进行符合匹配
提取元素:将需要提取的元素对应的布尔值数组匹配提取即可。提取后的结果返回一个一维数组
2.3.3 Numpy 数组计算
NumPy可以直接进行算术操作,比如两个数组相加可以直接使用arr1 + arr2
,两个数组对应元素相乘可以直接使用arr1 * arr2
此外,数组还可以调用通用函数(又称ufunc,一种在数组中进行逐元组操作的函数)实现更高级的功能
一元通用函数
函数 | 描述 |
| 逐元素地计算整数,浮点数或复数的绝对值 |
| 计算每个元素的平方 |
| 计算每个元素的平方根 |
| 计算每个元素的自然指数值 |
| 自然对数,对数2为底 |
| 计算每个元素的符号值(1:正,0:0,-1:负) |
| 计算每个元素的最高整数值 |
| 计算每个元素的最小整数值 |
| 将元素保留到整数部,并保持dtype |
| 分别返回整数和小数部分的数组 |
| 返回数组中的元素是否是一个NaN(布尔) |
| 三角函数:余弦、正弦、正切、双曲余弦、双曲正弦、双曲正切、反余弦、反正弦、反正切 |
| 对数组的元素按位取反 |
二元通用函数
函数 | 描述 |
| 将数组的对应元素相加 |
| 在第二个数组中,将第一个数组中包含的元素去除 |
| 将数组的对应元素相乘 |
| 除或整除(放弃余数) |
| 将第二个数组的元素作为第一个数组的幂次方 |
| 逐个元素计算最大值,fmax忽略NaN |
| 逐个元素计算最大值,fmin忽略NaN |
| 按元素的求模计算 |
2.3.4 广播规则
NumPy的广播遵循一组严格的规则,设定这组规则是为了对不同形状的数组进行操作
- 规则1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补1
- 规则2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另一个数组的形状
- 规则3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常
2.3.5 NumPy排序与唯一值
NumPy可以使用sort方法按照位置进行排序
直接排序
-
numpy.sort(arr)
//最常用的排序方法,不支持反向排序 -
numpy.sort(arr,axis)
//也可以指定一个axis 参数,使得sort函数可以沿着指定轴对数据集进行排序。axis=1为沿着横轴排序;axis=0为沿着纵轴排序
间接排序
-
numpy.argsort(arr)
//返回值为重新排序值的下标 -
numpy.lexsort((a,b,c))
//返回值是按照最后一个传入的数据排序的
2.3.6 NumPy 去重与重复数据
去重
- 通过
unique
函数可以找出数组中的唯一值并返回
重复
-
np.tile(A,reps)
//tile函数主要有两个参数,参数A
指定重复的数组,参数reps
指定重复的次数 -
np.repeat(a,repeats,axis=None)
//repeat函数主要有三个参数,参数a
是需要重复的数组元素,参数repeats
是重复次数,参数axis
指定沿着哪个轴进行重复,axis = 0表示按行进行元素重复;axis = 1表示按列进行元素重复。 - 这两个函数的主要区别在于,tile函数是对数组进行重复操作,repeat函数是对数组中的每个元素进行重复操作。
2.3.7 NumPy统计函数
使用聚合函数可以直接对数组进行计算,当axis=0时,表示沿着纵轴计算。当axis=1时,表示沿着横轴计算。默认时计算一个总值
函数 | 说明 |
| 计算数组的和 |
| 计算数组均值 |
| 计算数组标准差 |
| 计算数组方差 |
| 计算数组最小值 |
| 计算数组最大值 |
| 返回数组最小元素的索引 |
| 返回数组最大元素的索引 |
| 计算所有元素的累积和 |
| 计算所有元素的累积积 |
2.3.8 通过函数改变数组的形状
改变数组的形状
numpy.reshape(arr,newshape)
arr.resahpe(newshape)
-
numpy.expand_dims(dim_index)
//在指定维度上增加一个维度
展平数组
arr.ravel()
arr.flatten()
-
arr.flatten('F')
//按列展开
效果 | 方向 | 函数 |
组合 | 横向 |
|
纵向 |
| |
分割 | 横向 |
|
纵向 |
|
2.4 Numpy 线性代数
2.4.1 矩阵计算
操作 | 功能 |
| 矩阵与数相乘 |
| 矩阵相加减 |
| 矩阵相乘 |
| 矩阵对应元素相乘 |
矩阵特有属性:
属性 | 说明 |
T | 返回自身的转置 |
H | 返回自身的共轭转置 |
I | 返回自身的逆矩阵 |
A | 返回自身数据的二维数组的一个视图 |
2.4.2 线性函数
线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。numpy的linalg拥有一个矩阵分解的标准函数集
函数 | 描述 |
| 矩阵点乘 |
| 计算对角元素和 |
| 计算矩阵行列式 |
| 计算方阵的特征值和特征向量 |
| 计算方阵的逆矩阵 |
| 计算矩阵的QR分解 |
| 计算矩阵的奇异值分解 |
| 求解x的线性系统Ax=B,其中A时矩阵 |
| 就按Ax=B的最小二乘解 |