• 作者:韩信子@ShowMeAI
  • 教程地址:https://www.showmeai.tech/tutorials/33
  • 本文地址:https://www.showmeai.tech/article-detail/143
  • 声明:版权所有,转载请联系平台与作者并注明出处
  • 收藏ShowMeAI查看更多精彩内容

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 的宝宝也可以直接借助 Google Colab一键运行与交互学习!

下载数据分析速查表

Awesome cheatsheets | ShowMeAI速查表大全 系列包含『编程语言』『AI技能知识』『数据科学工具库』『AI垂直领域工具库』四个板块,追平到工具库当前最新版本,并跑通了所有代码。点击 官网GitHub 获取~

图解数据分析(10) | Numpy - 与2维数组操作(数据科学家入门·完结)相关推荐

  1. 图解数据分析(9) | Numpy - 与1维数组操作(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  2. 图解数据分析(13) | Pandas - 核心操作函数大全(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  3. 图解数据分析(12) | Pandas - 数据分析工具库介绍(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  4. 图解数据分析(5) | 核心步骤2 - 数据清洗与预处理(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  5. 图解数据分析(3) | 数据分析的数学基础(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  6. 图解数据分析(1) | 数据分析介绍(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  7. Numpy之N维数组-ndarray

    Numpy之N维数组-ndarray 1 ndarray的属性 数组属性反映了数组本身固有的信息. 属性名字 属性解释 ndarray.shape 数组维度的元组    [假如是8行5列的数组,将会返 ...

  8. Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】

    目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...

  9. numpy获取二维数组某一行、某一列

    numpy获取二维数组某一行.某一列 1.需求 有一个二维数组: a = [[1, 2, 3, 4, 5, 6],[7, 8, 9, 10, 11, 12],[13.2, 14.8, 15.9, 16 ...

最新文章

  1. oracle 查看锁表进程和解锁
  2. MySQL 快速入门教程
  3. ML之SVM:SVM算法的简介、应用、经典案例之详细攻略
  4. 手写简版spring --9--对象作用域和FactoryBean
  5. java 字符串数组连接
  6. linux交叉编译tile环境搭建,g ++ - 在Ubuntu中在32位上交叉编译64位程序时,缺少包含“bits / c ++ config.h”...
  7. slide简介(大数据技术)
  8. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
  9. 一张图带你了解python
  10. iOS:解决pod的Insecure world writable dir问题
  11. Apache 基金会宣布 Apache Kylin 成为顶级项目
  12. Java千百问_05面向对象(013)_泛型如何使用
  13. 尚硅谷大数据Spark之RDD转换算子学习笔记及面试题
  14. mysql 如何去掉毫秒_MySQL 关于毫秒的处理-阿里云开发者社区
  15. pmos低电平驱动_详细讲解MOSFET管驱动电路
  16. 新交规驾驶证扣分什么时候清零
  17. w10系统服务器如何创建新用户,win10添加新用户的方法分享
  18. 机器学习入门之莺尾花训练
  19. 镭速联合Azure Blob 存储,重塑大文件传输平台存储架构
  20. 幼儿园数学目标_幼儿园大班数学计划

热门文章

  1. Nice, 我用AI给表情包分门别类
  2. 谭嗣同的这首诗《狱中题壁》
  3. 会计数的小跳绳,室内也能愉快健身
  4. 骁龙芯片能牵容鸿蒙系统吗,活见久!华为新机曝光:搭载骁龙870处理器,运行鸿蒙系统!...
  5. js 跳转到指定位置 高德地图_在H5页面内通过地址调起高德地图实现导航
  6. hosts文件无法修改无法保存
  7. 2023离职与调薪调研报告
  8. 雷达算法matlab代码,radar_sort 雷达信号的分选程序包括sdif,pri变换,cdif算法 matlab 267万源代码下载- www.pudn.com...
  9. 无向图的创建(java实现)
  10. 不朽凡人 正文 第五百四十九章 第二轮结果