NumPy作为Python的常用库,主要实现数组的计算和分析。
上回书说到:NumPy数组创建、索引、切片、转置的定义和注意事项;
顺其自然,就涉及到矩阵的运算:
A.数学函数:针对数组和元素的通用函数,包含单个数组的一元函数:开方、指数、取整、判断NaN等;也包含多个数组的二元函数:加、减、相乘、整除、大小比较等;还有比较特殊的矩阵计算:点乘。
- 一元函数:
np.sqrt( ) ## 开方
np.exp( ) ## 指数e^x
np.abs( )、np.fabs( ) ## 取绝对值、快速绝对值(fast abs)
np.rint( ) ## 四舍五入取整
np.ceil(arr)、np.floor(arr) ## 取 ≥ arr 得最小整数;取 ≤arr 得最大整数。
np.isnan( ) ## 返回不是数字(NaN)的 布尔型数组
decimal,integer = np.modf(arr) ## 将 arr 的小数部分、整数部分分开,分别赋值给新变量。
- 一元函数:针对矩阵的 行列 的数值计算;
arr.mean(axis=1) ## 输出 每一 行 的均值 ; (可以增加 axis 参数,axis可以省略 )
arr.sum(0) ## 输出 每一 列 的和
arr.cumsum(0) ## 保持矩阵的相同维度, 在每一 列 的原始位置,输出中间步骤 的 累 加值
arr.cumprod(0) ## 保持矩阵的相同维度, 在每一 列 的原始位置,输出中间步骤 的 累 乘值
应用方向: 累加—— 用于计算累计的总量;
累乘—— 用于计算当前量,通过原始量、实时变化率,计算当前 数据值。
4. 二元函数:
np.maxinum(x,y) ## 取元素的较大值
np.add(x,y) ## 元素相加
np.subtract(x,y) ## 从第一个数组减去第二个数组的元素
np.multiply(x,y) ## 数组之间的元素相乘
np.divide(x,y)、np.floor_divide(x,y) ## 除法、整除(向下取整)
np.mod(x,y) ## 除法,取余数;(同EXCEL)
np.greater(x,y)、np.greater_equal(x,y)、np.less(x,y)、np.less_equal(x,y) ## >、 ≥、<、≤
- 矩阵的点乘:
x.dot(y) == np.dot(x,y); x@np.one(3) == np.dot(x,np.ones(3))
x.T.dot(x) # 计算 x 的内积。
Tips:布尔型数组的妙用。
1)在常用的矩阵数组中,可以利用条件语句,将生成的布尔型数组与函数结合,实现一定的功能。
sum()函数,可实现累加功能;
当结合数组的判断语句,可实现>0的计数器功能:
(arr>0).sum( ) # 计数
2)直接应用在布尔型数组上,存在两个函数:
arr.any( ) #检查是否存在 True 值,或是否存在不为 0 的值
arr.all( ) #检查是否全为 True 值,或是否全不为 0 的值
B.功能函数:针对矩阵,实现依据条件变更、排序、提取、累加等目的的函数。
1.条件-变更函数:在数据分析中,将原数组arrx元素,依据cond,看是否变更为arry的元素,生成新数组
arrnew = np.where(cond,arrx,arry) ## == if condition , arrx;
else arry.
例如:
np.where(arr>0,arr,0) #arr数组中的所有元素,当元素<=0,就讲元素全部置为 0
2.排序函数:
arr.sort( ) #一维数组的原地排序
arr.sort(1) # 在每一行,进行原地排序;axis 可以省略;
b=np.sort(arr,axis=0) # 返回排序后数组,原数组不变;# 当axis缺省时,按照每一行排序;axis=0,按照每一列排序;#axis=None,整体排序,生成一维数组。
3.网格、坐标矩阵生成函数:np.meshgrid();
np.meshgrid(x,y) # 生成两个2维 矩阵,一个以数组 x 为一行,一共复制 len(yT) 行;# 一个以数组 y·T 为一列,共 复制len(x) 列。
常用于 二维矩阵的坐标转化,通过函数式 ,构建三维模型,举例如下:
x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
xx, yy = np.meshgrid(x, y )
zz = (xx**2 + yy**2)
……
ax.plot_surface(xx, yy, zz, rstride=1, cstride=1, cmap='rainbow') ## 暂时没学到,后续再来更新
……
C.矩阵范数:涉及矩阵的求逆和 linalg()函数
- AB=BA=E,则称 B为A的逆矩阵:
np.linalg.inv() # 矩阵求逆
x.dot(inv(x)) #结果为单位矩阵
矩阵行列式: np.linalg.det()
- 矩阵范数:
np.linalg.norm(x, ord= ……, axis=……, keepdims=False)
## ord代表范数的种类:当ord=2(缺省值),二范数 即 所有元素的平方和,再开方;
## 当ord =1,一范数,即所有元素绝对值的和;
## 当ord = np.inf, 无穷范数,即 所有元素绝对值中,最大值;
## axis = 0,则按列向量处理,求出每个 列向量 的范数;
## axis = 1,则按行向量处理,求出每个 行向量 的范数;
## keepdims = True ,保留原数组 x 的二维特性,输出 [[……]];.shape=(,),有两个输出;
## False,不保留 原数组特性,输出 [……]; .shape(),只有一个输出。