共计 3432 个字符,预计需要花费 9 分钟才能阅读完成。
作者:韩信子 @ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/33
本文地址:http://www.showmeai.tech/article-detail/143
申明:版权所有,转载请分割平台与作者并注明出处
n 维数组是 NumPy 的外围概念,大部分数据的操作都是基于 n 维数组实现的。本系列内容笼罩到 1 维数组操作、2 维数组操作、3 维数组操作方法,本篇解说 Numpy 与 2 维数组操作。
一、向量初始化
NumPy 中曾有一个专用的 matrix 类来代表矩阵,起初被弃用,当初 NumPy 中的矩阵和 2 维数组示意同一含意。
(1)矩阵初始化
矩阵初始化的语法与向量是相似的:
如上要应用双括号,这里的 (3,2) 是第 1 个参数示意矩阵维度,第 2 个地位参数(可选)是为 dtype(也承受整数)保留的。
(2)随机矩阵生成
随机矩阵的生成也与向量相似:
(3)二维数组索引
二维数组的索引语法要比嵌套列表更不便:
“view”示意数组切片时并未进行任何复制,在批改数组后,相应更改也将反映在切片中。
二、轴参数
在很多矩阵运算操作中,NumPy 能够实现跨行或跨列的操作。为了实用任意维数的数组,NumPy 引入了 axis 的概念。
axis 参数的值实际上就是维度值,如第一个维是 axis=0
,第二维是axis=1
,依此类推。因而,在 2 维数组中,axis= 0 指列方向,axis=1
指行方向。
三、矩阵运算
除了 +,-,_,/,// 和 *_等数组元素的运算符外,NumPy 提供了 @ 运算符计算矩阵乘积:
相似一维向量中的播送机制,NumPy 同样能够通过播送机制实现向量与矩阵,或两个向量之间的混合运算,如下图所示:
留神,上图最初一个示例是对称的逐元素乘法。应用矩阵乘法 @能够计算非对称线性代数外积,两个矩阵调换地位后计算内积:
四、行向量与列向量
在 NumPy 的 2 维数组中,行向量和列向量是被区别对待的。通常 NumPy 会尽可能应用繁多类型的 1 维数组(例如,2 维数组 a 的第 j 列 a[:, j]是 1 维数组)。默认状况下,一维数组在 2 维操作中被视为行向量,因而,将矩阵乘行向量时,应用形态 (n,) 或(1,n)的向量后果统一。有多种办法能够从一维数组中失去列向量,但并不包含 transpose:
应用 reshape 操作增加新的 axis 能够更新数组形态和索引,也能够将 1 维数组转化为 2 维列向量:
其中,- 1 示意在 reshape 是该维度主动决定,方括号中的 None 等同于 np.newaxis,示意在指定地位增加一个空轴。
总结一下,NumPy 中共有三种类型的向量:1 维数组,2 维行向量和 2 维列向量。以下是两两类型转换图:
依据播送规定,一维数组被隐式解释为二维行向量,因而通常不用在这两个数组之间进行转换,对应图中暗影化区域。
严格来说,除一维外的所有数组的大小都是一个向量(如 a.shape == [1,1,1,5,1,1]),因而 NumPy 的输出类型是任意的,但上述三种最为罕用。能够应用 np.reshape 将一维矢量转换为这种模式,应用 np.squeeze 可将其复原。这两个性能都通过 view 发挥作用。
五、矩阵操作
矩阵的拼接有以下两种形式:
图示操作仅实用于矩阵重叠或向量重叠,而一维数组和矩阵的混合重叠只有通过 vstack 才可实现,hstack 会导致维度不匹配谬误。因为前文提到将一维数组作为行向量,而不是列向量。为此,能够将其转换为行向量,或应用专门的 column\_stack 函数执行此操作:
与 stack 对应的是 split,能够对矩阵进行切分解决:
矩阵复制有两种形式:
- tile 相似粘贴复制;
- repeat 相当于分页打印。
delete 能够删除特定的行或列:
相应插入操作为 insert:
与 hstack 一样,append 函数无奈主动转置 1D 数组,因而须要从新调整向量形态或增加维数,或者应用 column\_stack:
如果仅仅是向数组的边界增加常量值,pad 函数是足够的:
六、Meshgrids 网格
播送机制使得 meshgrids 变得容易。例如须要下图所示(但尺寸大得多)的矩阵:
上述两种办法因为应用了循环,因而都比较慢。MATLAB 通过构建 meshgrid 解决这种问题。
meshgrid 函数承受任意一组索引,通过 mgrid 切片和 indices 索引生成残缺的索引范畴,而后,fromfunction 函数依据 I 和 J 实现运算。
在 NumPy 中有一种更好的办法,无需在内存中存储整个 I 和 J 矩阵(尽管 meshgrid 已足够优良,仅存储对原始向量的援用),仅存储形态矢量,而后通过播送规实现其余内容的解决:
如果没有 indexing =’ij’参数,那么 meshgrid 将更改参数的程序,即 J,I=np.meshgrid(j,i)——一种用于可视化 3D 绘图的“xy”模式(祥见该文档)。
除了在二维或三维网格上初始化函数外,网格还能够用于索引数组:
以上办法在稠密网格中同样实用。
七、矩阵统计
就像 sum 函数,NumPy 提供了矩阵不同轴上的 min/max, argmin/argmax, mean/median/percentile, std/var 等函数。
np.amin
等同于 np.min
,这样做同样是为了防止from numpy import *
可能的歧义。
2 维及更高维中的 argmin 和 argmax 函数别离返回最小和最大值的索引,通过 unravel\_index 函数能够将其转换为二维坐标:
all 和 any 同样也可作用于特定维度:
八、矩阵排序
尽管在前文中,axis 参数实用于不同函数,但在二维数组排序中影响较小:
咱们通常不须要上述这样的排序矩阵,axis 不是 key 参数的代替。但好在 NumPy 提供了其余性能,这些性能容许按一列或几列进行排序:
1、a[a [:,0] .argsort()]
示意按第一列对数组进行排序:
其中,argsort 返回排序后的原始数组的索引数组。
能够重复使用该办法,但千万不要搞混:a = a[a[:,2].argsort()]
a = a[a[:,1].argsort(kind='stable')]
a = a[a[:,0].argsort(kind='stable')]
2、函数 lexsort 能够像上述这样对所有列进行排序,然而它总是按行执行,并且排序的行是颠倒的(即从下到上),其用法如下:
a[np.lexsort(np.flipud(a[2,5].T))]
,首先按第 2 列排序,而后按第 5 列排序;a[np.lexsort(np.flipud(a.T))]
,从左到右顺次排序各列。
其中,flipud 沿高低方向翻转矩阵(沿 axis = 0 方向,与 a [::-1,…]等效,其中…示意“其余所有维度”),留神辨别它与 fliplr,fliplr 用于 1 维数组。
3、sort 函数还有一个 order 参数,但该办法极不敌对,不举荐学习。
4、在 pandas 中排序也是不错的抉择,因为在 pandas 中操作地位确定,可读性好且不易出错:
pd.DataFrame(a).sort_values(by=[2,5]).to_numpy()
,先按第 2 列排序,再按第 5 列排序。pd.DataFrame(a).sort_values().to_numpy()
,按从左到右的程序对所有列进行排序。
材料与代码下载
本教程系列的代码能够在 ShowMeAI 对应的 github 中下载,可本地 python 环境运行,能迷信上网的宝宝也能够间接借助 google colab 一键运行与交互操作学习哦!
本系列教程波及的速查表能够在以下地址下载获取:
- NumPy 速查表
- Pandas 速查表
- Matplotlib 速查表
- Seaborn 速查表
拓展参考资料
- NumPy 教程
- Python NumPy 教程
ShowMeAI 相干文章举荐
- 数据分析介绍
- 数据分析思维
- 数据分析的数学根底
- 业务认知与数据初探
- 数据荡涤与预处理
- 业务剖析与数据挖掘
- 数据分析工具地图
- 统计与数据科学计算工具库 Numpy 介绍
- Numpy 与 1 维数组操作
- Numpy 与 2 维数组操作
- Numpy 与高维数组操作
- 数据分析工具库 Pandas 介绍
- 图解 Pandas 外围操作函数大全
- 图解 Pandas 数据变换高级函数
- Pandas 数据分组与操作
- 数据可视化准则与办法
- 基于 Pandas 的数据可视化
- seaborn 工具与数据可视化
ShowMeAI 系列教程举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程