文章目录

  • 前言
  • 0 遇事不决,先查官网,查着查着就查熟了
  • 1 矩阵运算及其必要性
  • 2 矩阵的创建
    • 2.1 普通矩阵
    • 2.2 特殊矩阵
  • 3 矩阵的索引
    • 3.1 str, list, tupple的索引
    • 3.2 numpy索引
  • 4 矩阵的运算
    • 4.1 通用函数与广播机制
    • 4.3 矩阵乘法
    • 4.4 矩阵求逆
    • 4.5 矩阵转置
    • 4.6 向量合并
    • 4.7 形状变换
    • 4.8 方阵的行列式和秩
    • 4.9 方阵的迹
    • 4.10 解线性方程
  • 5 使用总结
    • 5.1 获取numpy数组的大小
    • 5.2 统计数组中元素出现次数
    • 5.3 拷贝与视图
    • 5.4 用列表给一个元素赋值 //2022.11.12
    • 5.5 numpy数组获取数据类型并改变数据类型
    • 5.6 利用numpy生成含有具体比例的0和1数组

前言

  因为课程需要,第一次这么彻底地接触numpy。虽闻名已久,但是真正使用numpy才感受到它的强大,发现它尤其适合数据分析与处理。这里根据自己的使用经验简单总结一下numpy在矩阵运算中的应用,之后也会根据自己的实践经历不断更新。

0 遇事不决,先查官网,查着查着就查熟了

  • numpy中文官网:https://www.numpy.org.cn/reference/
  • numpy英文官网:https://numpy.org/doc/stable/

建议主要参考英文官网,中文官网翻译有点生硬的感觉。。。

补充教程:numpy速查手册

1 矩阵运算及其必要性

  所谓的数据处理,其本质大都可以归为矩阵运算。因为需要处理的数据大都是矩阵或向量的形式,因此个人认为一个工具适不适合做数据处理,一个重要的指标的就是支不支持矩阵运算,因为如果没有矩阵运算,循环去处理一大堆数据势必会造成运行过长的问题。而这也是为什么很多人会推荐在使用python处理数据的时候不要用它自带的list,而要用numpy。
  一般提到矩阵运算,我们首先想到的就是MATLAB(因为我是先接触的MATLAB~~),因此本文想对标MATLAB中的语法和使用来对比学习 python中的numpy库。

如果对MATLAB中矩阵运算不熟悉的同学可以看一下我之前的一篇博客。

意外发现其实numpy官网也有一个专门的教程来给熟悉MATLAB的开发人员看的,链接在这里。

2 矩阵的创建

2.1 普通矩阵

  numpy中创建矩阵的方式非常单一,一般就是使用np.array

import numpy as np
A = np.array([1,2,3])
# 参数还可以是一个已有的list类型
B = np.array(list_b)

如果要创建二维甚至多维矩阵,则可以利用中括号分隔,如下所示:

import numpy as np
C = np.array([[1,2,3],[2,3,4]])

中括号是分隔维度
  其实,array函数内部的参数可以非常复杂,具体可以看看官网。但是一般来说,最多就是再指定数组中元素的数据类型:

>>> np.array([1, 2, 3], dtype=complex)
array([ 1.+0.j,  2.+0.j,  3.+0.j])

  此外,还需要注意的是,使用 np.array 创建的矩阵其 数据类型np.ndarray ,这个在类型注解时需要注意。

对比MATLAB:
  在MATLAB中,创建矩阵是通过空格逗号来区分同一行的不同元素,用分号来区分不同行,如果创建高维矩阵(>2)不能简单地套中括号,而应该使用专门的函数来进行创建。

2.2 特殊矩阵

  和MATLAB一样,numpy也支持创建一些特殊矩阵:

  • 零矩阵:np.zeros()
  • 单位矩阵:np.eye()

3 矩阵的索引

  python中的数据索引,不同的数据类型有不同的运算符。

3.1 str, list, tupple的索引

参考链接

  对这些python自带的数据类型,索引数据时除了单独索引某个数据外,剩下的就只需要了解冒号运算符即可。
  冒号运算符的固定结构就是[start : stop : step],先来看几个例子理解一下。

再来总结一下上面的规律:上面的表达式[start : stop : step]当中有三个变量,其实可以把它们都视为函数的参数,且都含有默认值:
其中step参数默认值就是1;
start参数的默认值则为0,即整个序列的起点;
stop参数默认则为序列的终点。
除此之外,step参数最为特殊,即它可以为负值,相当于将其输出的序列顺序反过来,其间隔仍然为step的绝对值。而且,如果step参数取默认值,除不写该参数外,第二个冒号也可以省略。

3.2 numpy索引

  对于numpy的数组,其索引方式更加丰富。除了具有以上所有的索引方式外,numpy还多出一些索引方式,这里简单总结为三点:

  • 逗号运算符
    如果需要索引的数组为一个二维及以上的数组,如果是python自带的数据类型,只能是使用多个中括号的方式,但是对于numpy的数组,还可以采用逗号运算符,用来区分维度。如下所示。

  • 省略号运算符冒号运算符
    如果要取二维数组的某一行或某一列时,就涉及到需要取一整个维度的问题,可以采用省略号或冒号来实现,如下所示。

  • 列表索引(花式索引)
    对于numpy数组来说,除了使用上述的特殊符号外,还可以传入特定的向量,如下所示。

    换一种角度来看,其实上面传递的都可以视为一个列表,只是不是特别明显罢了。

对比MATLAB:
  在MATLAB中,矩阵的索引是通过圆括号来实现的,支持逗号运算符花式索引,对于冒号运算符,其结构为[start : step : stop],如果要反序,除step赋值为负数外,还需要将startstop交换顺序。而且MATLAB当中有一个end的宏变量,指定某一维的末尾。

4 矩阵的运算

4.1 通用函数与广播机制

  在学习numpy中矩阵运算规律前,最好要先了解一下numpy中的通用函数广播机制。这也是贯穿numpy矩阵运算所有的重要内容。
  所谓通用函数,是指能够同时对元素内所有元素逐个进行运算的函数。numpy当中几乎所有的计算函数都是通用函数,具体有哪些内容可以参考这篇博客。
  使用通用函数有一个非常大的好处就是本来需要循环遍历的列表可以一次性传入函数,大大节约了运算时间,此即向量化的思想。
  而所谓广播机制,个人认为可以从两方面来理解。

  • 对于需要传入单个参数的函数(f(x))来说,如果传入的是多个“单个参数”组成的列表([x1,x2,…]),那么函数将逐个取值并代入计算,最后返回值也将是原来输出值组成的列表([f1,f2,…])。
  • 对于算术运算符来说,如f(x1, x2) = x1 + x2,如果传入的参数维度不一致,那么函数会通过广播机制将输入的参数的维度变为一致。

  这里第一种情形比较好理解,关键在于理解第二种。需要明确的是,广播机制并适用于传入任意维度的参数,并不是简单粗暴地取公倍数。常见的有下面这4种类型。(m*n表示m行n列,左边为A,右边为B)

  • m*n + m*1 = m*n :相当于A的每一行的每一个数都加上B对应行的那个离散点;
  • m*n + 1*n = m*n:相当于A的每一行都和B相加;
  • m*n + 1*1 = m*n:相当于A的每个元素都加上B这个离散点;
  • 1*n + m*1 = m*n:相当于A的每一列都需要加上B这一行。

总结来看,两个向量能够应用广播机制的要求是在至少存在某一维,要么两个数值相等,要么有一个值为1
  以上是从矩阵的角度来理解,还可以考虑从列表的角度来理解。即把所有的参数都理解为列表。对于二维数组,可以理解为列表的列表。两个列表相加时,如果维度不同,维度高的需要先降维拆分,直到可以计算为止。如果发现即使降维拆分也无法满足可以计算的要求,则程序报错。

对比MATLAB:
  在MATLAB中,矩阵加减法也支持广播机制。

4.3 矩阵乘法

  关于矩阵乘法,有两个概念很有意思,叫做矩阵叉乘矩阵点乘。所谓叉乘就是一般的矩阵乘法,即前一个矩阵的列数要等于后一个矩阵的行数;而所谓矩阵点乘就是矩阵中每个对应元素相乘,要求两个矩阵同型,乘出来的矩阵大小不变。考虑到这两种运算非常常见,这里做了一个表,来对比python和MATLAB

Python MATLAB
矩阵乘法(叉乘) np.dot(A, B) A*B
矩阵点乘(对应元素相乘) A*B or np.multiply(A,B) A.*B

4.4 矩阵求逆

  • pythonnp.linalg.inv(A)

  • MATLAB: inv(A)

4.5 矩阵转置

  对numpy的数组,想要实现转置非常简单,直接在矩阵的后面加上.T即可。示例如下:

4.6 向量合并

  在进行数据处理时,经常会遇到一种需求那就是将多个列表合并成为一个矩阵。
  先来看看python中自带的列表是怎么操作的。对于list,如果想要合并成为一个大的列表,可以采用+extend函数,如下所示。

list的加号运算符本质就是调用extend函数

如果想要合成为一个矩阵,即列表的列表,也非常简单,直接用中括号连接即可。如下所示。

  除此之外,还可以使用append函数实现,如下所示。

需要注意的是,这里的append函数实现的是在前面的list后面直接加个逗号,再加上括号内的列表,后加入的列表会作为前一个列表的元素,注意这点和下面的np.append之间的区别

所以使用时最开始都是一个空列表,然后不断append。

此外,还需要注意的是,appendextend函数是修改列表本身,没有返回值!所以不能直接print(x.append(1)),因为得到的一定是Node

  再来看看numpy是怎么实现的。

除此之外,还可以使用其自带的vstackhstack函数来构建矩阵。

  这里需要注意的是,hstackvstack函数只能叠加同维度的向量或矩阵,比如x = [[1,2]]y=[3,4]就不能进行叠加,因为x的shape是(1,2),而y的shape是(2,)
  遇到这种问题可以通过调用reshape函数调整维度。

4.7 形状变换

  在numpy中,如果想要只改变矩阵的形状而不改变数据时,可以使用reshape函数。这里有两种使用方式:

import numpy as np
s = np.array([1,2,3,4,5,6])
# 第一种方法:复制一份
np.reshape(s,(3,2)) #需要注意,这里的大小一定要是合理的,否则会报错
# 第二种方法:直接在原来数组上修改
s.reshape(2,3)

  值得一提的是,第二种直接修改的方式在传参时,是支持解包的,即可以传(2,3),也可以传2,3,非常方便。

补充教程:python 中 numpy 模块的 size,shape, len的用法

4.8 方阵的行列式和秩

  在numpy中也可以求方阵的行列式和秩,其函数包含在其线性代数库linalg中,使用方式如下图所示。

4.9 方阵的迹

  所谓方阵的迹,是指主对角线元素之和,在numpy中使用方式如下所示。

4.10 解线性方程

  在numpy中还可以解线性方程,对于形式如AX=bAX=bAX=b的线性方程,使用numpy解方程的方式如下所示。

5 使用总结

5.1 获取numpy数组的大小

  获取numpy数组的大小一般有两个函数:shapesize,其中size返回数组的元素个数shape返回数组的维度,是一个元组。如果是一维的向量,返回的是(n, ),其中n为向量的长度。示例如下所示。

5.2 统计数组中元素出现次数

  在计算信息熵时,常常需要统计数组中元素的出现次数。对于一般的python中的list,如果需要统计数组中各个元素出现次数,可以采用先将list转换为set,然后遍历整个list,如下代码所示。

uniqueValue = set(Value) #这一列的不同取值
uniqueNum = len(uniqueValue) #取值有多少种情况
Dict = dict(zip(uniqueValue,np.zeros(uniqueNum, dtype=int))) #构建一个字典, value(标签对应的样本个数)初值全为0
for item in Value:Dict[item] += 1

这里利用了zip函数将两个列表构建成为一个字典

  但是在numpy中,使用相对简单:

unique_values = np.unique(a) #提取numpy数组a中单独的数据
unique_values, indices_list = np.unique(a, return_index=True) #提取numpy数组a中单独的数据并返回各个独立值出现的第一个索引
unique_values, occurrence_count = np.unique(a, return_counts=True)#提取numpy数组a中单独的数据并返回各个独立值出现的次数

参考链接

此外,对于非负整数的情况,还可以使用bincount函数,具体可以参考官方文档

5.3 拷贝与视图

  先来看看官网的解释:

总结:

  • 取的是view:

    • 直接创建view()
    • 简单的赋值
    • 普通的下标索引
    • 调用reshape函数,向量本身并不修改,其返回值为形状改变后的数组
  • 取的是copy
    • 直接创建copy()
    • 花式索引(传入一个列表的情况)
    • 含有返回值的特定函数

5.4 用列表给一个元素赋值 //2022.11.12

  这是最近遇到的一个问题,先看代码:

从例子中我们可以看出,当用列表给一个元素赋值时,如果数据类型是数字类型(int, float等),numpy会自动去掉外面的括号,而如果是其他的数据类型,则必须添加索引, 否则会报错setting an array element with a sequence,即用一个列表给数组元素赋值。

5.5 numpy数组获取数据类型并改变数据类型

  • 获取数据类型a.dtype,如果直接用type(a)得到的是数组a的数据类型,就是ndarray
  • 改变数据类型a.astype(int)

5.6 利用numpy生成含有具体比例的0和1数组

其中shuffle函数能够实现随机打乱一个数组,从而可以实现固定比例随机抽取的效果。

【Python】numpy矩阵运算大全相关推荐

  1. python numpy矩阵运算加速器 NumExpr

    首先是安装 然后是导包 import numexpr as ne 然后是包裹 比如 a=1+1 包裹上就是 a=ne.evaluate('1+1') 记得括号里的计算式一定要加上引号,变成字符串... ...

  2. [转载] python numpy矩阵运算加速器 NumExpr

    参考链接: Numpy 字符串运算 首先是安装  然后是导包 import numexpr as ne 然后是包裹 比如 a=1+1 包裹上就是 a=ne.evaluate('1+1') 记得括号里的 ...

  3. python中numpy矩阵运算操作大全(非常全)!

    python中numpy矩阵运算操作大全(非常全) //2019.07.10晚 python矩阵运算大全 1.矩阵的输出形式: 对于任何一个矩阵,python输出的模板是: import numpy ...

  4. 用python绘制柱状图标题-使用Python绘制图表大全总结

    在使用Python绘制图表前,我们需要先安装两个库文件numpy和matplotlib. Numpy是Python开源的数值计算扩展,可用来存储和处理大型矩阵,比Python自身数据结构要高效:mat ...

  5. Matlab和Python(Numpy,Scipy)与Lapack的关系

    说到数值计算,可能许多人都能立马想到Matlab.Matlab多年的持续影响力已经让它成为许多人心中科学计算的代名词.但它底层一个重要的库Lapack却很少有人知道. 而Python年龄比Matlab ...

  6. Python+numpy实现蒙特卡罗方法估计圆周率近似值

    问题描述:使用蒙特卡罗方法估计圆周率近似值,具体描述详见以前发的文章蒙特.卡罗方法求解圆周率近似值原理与Python实现 技术要点:Python扩展库numpy中的模块random可以批量生成特定范围 ...

  7. Python+numpy实现矩阵QR分解

    感谢广东东软学院计算机系赵晨杰老师的交流. 如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解. Python扩展库numpy实现了矩 ...

  8. Python NumPy教程

    Welcome to Python NumPy tutorial. In our previous tutorial, we learned about Python switch case. In ...

  9. python处理矩阵运算、转置矩阵、逆矩阵、单位矩阵

    文章目录 python处理矩阵运算 转置矩阵 单位矩阵&反向单位矩阵 逆矩阵 矩阵相乘 python处理矩阵运算 转置矩阵 import numpy as np matrix = [[1, 2 ...

  10. python Numpy 中的矩阵向量乘法(np.multiply()、np.dot()、np.matmul() 和 星号(*)、@)

    python Numpy 中的矩阵向量乘法 总结 1. 对于 np.array 对象 1.1 元素乘法 用 a*b 或 np.multiply(a,b) 1.2 矩阵乘法 用 np.dot(a,b) ...

最新文章

  1. 说说第三方支付接口开发及开发中遇到的坑爹问题
  2. 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
  3. WLAN高密无线网络部署的信道问题
  4. SQL-Server使用点滴(一-数据对象篇)
  5. python numpy数组中冒号 : 的使用--全局选择、表示区间
  6. android打开sqlite数据库,Android:打开和关闭SQLite数据库
  7. IEEE ISO/IEC简介
  8. 在线播放器 在网页中插入MediaPlayer 兼容IE和FF的代码调试
  9. STM32CubeIDE 下载与安装步骤(一)
  10. 2018年最好用的百度网盘资源搜索神器排行
  11. creo绘图属性模板_Creo (ProE) 电极工程图图框配置详细教程 (提供模板prt文档下载)|工程制图|图文教程|PTC在线社区...
  12. 数据结构之数组及动态数组剖析
  13. 人工智能开发语言排行榜: 不死Java, 不朽C/C++, 新贵Python
  14. JSP——JSTL定制标签 - 递归标签显示属性结构
  15. UTC时间转换为当前时区时间
  16. 干货!一文搞定无头浏览器的概念以及在selenium中的应用
  17. codeblocks debug
  18. (附源码)springboot 网上商品定制系统 毕业设计 180915
  19. pandas填补缺失值的方法
  20. ffmpeg编译裁剪移植到arm-linux

热门文章

  1. Axure使用 element UI 元件库
  2. 蚂蚁金服 ant design 下载axure 组件库
  3. python实验总结与分析_Python程序设计实验一报告
  4. Spine 1.73+ 和谐版
  5. 快速查找文件的神器Listary
  6. 操作系统概念第五章部分作业题答案
  7. 规避VMware虚拟机检测
  8. 工程数学线性代数(同济版)第一到六章答案大全线代答案工程数学线代答案
  9. 数字化医院网络终端安全管理
  10. Excel转批量转Csv工具软件