Python学习(2)-NumPy矩阵与通用函数

文章首发于:My Blog 欢迎大佬们前来逛逛

1. NumPy矩阵

1.1 mat函数

mat=asmatrix
asmatrix(data, dtype=None):

data:表示输入的数组或者字符串,使用‘,’分割列,使用‘;’分割行

创建两个普通的矩阵:

print(np.mat([1, 2, 3]))
print(np.mat("1,2,3;4,5,6;7,8,9"))
--------
[[1 2 3]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]

需要注意:mat创建的矩阵是不会产生副本的,即共享内存

a1 = np.array([1, 2, 3, 4, 5])
ma1 = np.mat(a1)
ma1[0, 0] = 100
print(ma1)
print(a1)   # a1[0,0]也会改变
---------
[1 2 3 4 5]
[[100   2   3   4   5]]
[100   2   3   4   5]

1.2 matrix函数

matrix也是创建矩阵的:

 matrix(data, dtype=None, copy=True)

data:数组或者字符串,与mat一样

copy:表示创建的矩阵与原数组data是不是拷贝的如果是拷贝的,则不共享内存;否则共享内存

注意到:mat默认共享内存,matrix可以选择拷贝,他们的不同仅此而已

print(np.matrix([1, 2, 3, 4, 5]))
print(np.matrix('1,2,3;4,5,6'))
a1 = np.array([1, 2, 3, 4, 5])
ma1 = np.matrix(a1, copy=True)
ma1[0, 0] = 100
print(a1) # 不变
----------
[[1 2 3 4 5]]
[[1 2 3]
 [4 5 6]]
[1 2 3 4 5]

1.3 bmat函数

bmat可以产生一个分块矩阵

bmat(obj, ldict=None, gdict=None)

obj:数组或者字符串

ldict,gdict:字典

a1 = np.arange(4).reshape(2, 2)
a2 = np.arange(5, 9).reshape(2, 2)
print(a1)
print(a2)
print(np.bmat([a1, a2]))
print(np.bmat('a1,a2;a2,a1')) # 四块 2*2 矩阵合并成一个大的4*4的矩阵
---------
[[0 1]
 [2 3]]
[[5 6]
 [7 8]]
[[0 1 5 6]
 [2 3 7 8]]

[[0 1 5 6]
 [2 3 7 8]
 [5 6 0 1]
 [7 8 2 3]]

1.4 矩阵运算

我们所熟知的运算,NumPy矩阵运算都可以实现:

print(a1 + a2)
print(a1 - a2)
print(a1 * a2) # 注意只能是满足矩阵运算条件 即 m*n 的m的列数要等与n的行数,结果为m的行数*n的列数
print(a1 / a2)
print(a1 ** a2)  
---------
[[ 5  7]
 [ 9 11]]
[[-5 -5]
 [-5 -5]]
[[ 0  6]
 [14 24]]
[[0.         0.16666667]
 [0.28571429 0.375     ]]
[[   0    1]
 [ 128 6561]]

矩阵的特有属性:

  • T:转置
  • H:共轭转置
  • I:逆矩阵
  • A:转换为二维数组
a2 = np.matrix('1,2,3;4,5,6;7,8,9')
print(a2.T)  # 求转置
print(a2.H)  # 共轭转置
print(a2.I)  # 逆矩阵
print(a2.A)  # 自身的二维数组

2. NumPy通用函数

2.1 ufunc运算函数

注意:ufunc的运算操作是对于数组的运算,而不是矩阵,矩阵的运算是 NumPy 实现的。

ufunc的运算不是矩阵的运算,因此对于不符合矩阵乘法条件的两个数组相乘是合法的。

np.all:对于数组的元素需要全部满足

np.any:对于数组的元素只需要存在即可

创建数组:

a3 = np.array([1, 2, 3])
a4 = np.array([2, 3, 4])
print(a3 + a4)
# ....
print(np.all(a3 > 2))  # a3全部元素大于2
print(np.any(a3 > 2))  # a3任意一个元素大于2
-------
[3 5 7]
False
True

2.2 ufunc广播机制

对于数组的运算,我们会对数组的shape有要求;但是如果shape不一样,我们仍然可以对他们进行运算操作,只需要对他们使用广播机制即可。

广播机制必须满足的前提条件:

  1. 两个数组必须具有相同的维数,每个维的长度要么是相同的,要么是1
  2. 维数少的数组需要在其形状上加上n个长度为1的维数,以便使得满足条件1.

例子1:

a1数组是 2行4列的,a2数组是 1行4列的。

我们可以发现,a2数组的行数少 1,因此需要在a2的shape上对其行数加1,使得a2数组变为(2,4),那么他们的形状相同模拟为使得在B的末尾新添加一行与第一行相同的元素,因此可以相加,总结为:

A.shape=(2,4) ;B.shape=(1,4) ----> B.shape=(2,4)

然后再执行A与B相加。

a1 = np.random.randint(0, 8, (2, 4))
a2 = np.random.randint(0, 4, 4)
print(a1)
print(a2)
print(a1 + a2)
-------
[[7 6 3 5]
 [2 7 5 2]]

[1 3 0 2]

[[ 8  9  3  7]
 [ 3 10  5  4]]

例子2:

此时我们的a1的shape是 4行3列,a2的shape是 4行1列,因此需要在a2的shape中对a2的列数加1,直到他们的shape相同,使得a2也变为 4行3列的,模拟在a2的后面新添加两列与第一列相同的元素即可

A,shape=(4,3) B.shape=(4,1) ----> B.shape=(4,3)

然后再执行相加。

a1 = np.random.randint(0, 12, (4, 3))
a2 = np.random.randint(0, 4, (4, 1))
print(a1)
print(a2)
print(a1 + a2)
---------
[[ 0  6  6]
 [11  1  3]
 [ 4 10  6]
 [11  1  4]]
 
[[3]
 [1]
 [2]
 [3]]
 
[[ 3  9  9]
 [12  2  4]
 [ 6 12  8]
 [14  4  7]]

2.3 统计分析函数

2.3.1 排序函数

sort函数直接对对象数组进行升序排序:

a1 = np.random.randint(10, 20, 10)
a1.sort()
print(a1)
-----------
[11 11 12 12 13 15 16 16 18 19]

使用 np.sort() 对数组排序后生成一份拷贝

a1 = np.random.randint(10, 20, 10)
print(np.sort(a1))
print(a1)
--------
[10 10 11 12 13 13 13 15 15 18]
[13 12 15 13 13 11 10 18 15 10]

argsort函数会产生索引数组,其中索引表示的是按照升序排序后,对应位置的元素在原数组中的对应的索引位置

例如新生成的索引数组的 :

  • [0] = 8,表示这个排序后的值[0]位置的值在原数组中是第8个(下标0开始),为10
  • [1] = 1,表示为第1个,为 11
  • [2] = 2,表示为第2个,为 11

a1 = np.random.randint(10, 20, 10)
print(a1)
print(a1.argsort())
----------
[16 11 11 18 17 15 17 19 10 15]
[8 1 2 5 9 0 4 6 3 7]

lexsort表示对多个键的数组进行间接排序,也是返回一个索引数组。

2.3.2 去重与重复函数

unique函数的作用是去掉重复的元素

a1 = np.random.randint(10, 20, 10)
print(a1)
print(np.unique(a1))
---------
[15 13 18 14 15 15 12 17 18 16]
[12 13 14 15 16 17 18]

unique可以指定参数

  • return_index:是否返回唯一元素的索引
  • return_inverse:是否返回用索引重建的数组
  • return_counts:是否返回唯一数组中元素出现的次数
a1 = np.random.randint(10, 20, 10)
print(a1)
print(np.unique(a1, return_index=True))   # 返回唯一元素的索引值
print(np.unique(a1, return_inverse=True))# 使用唯一索引重建数组
print(np.unique(a1, return_counts=True)) # 统计唯一数组的元素出现的次数
----------
[10 13 15 19 10 15 15 14 13 17]
(array([10, 13, 14, 15, 17, 19]), array([0, 1, 7, 2, 9, 3], dtype=int64))
(array([10, 13, 14, 15, 17, 19]), array([0, 1, 3, 5, 0, 3, 3, 2, 1, 4], dtype=int64))
(array([10, 13, 14, 15, 17, 19]), array([2, 2, 1, 3, 1, 1], dtype=int64))

tile用于重复数组的值

tile(A, reps)

A:表示需要重复的数组

reps:重复的次数

如下,我们把5*2的数组重复了三次,让他变成了 5 * 6的

a1 = np.random.randint(10, 20, (5, 2))
print(np.tile(a1, 3))
--------
[[14 18 14 18 14 18]
 [14 10 14 10 14 10]
 [18 17 18 17 18 17]
 [12 12 12 12 12 12]
 [19 12 19 12 19 12]]

repeat函数也是重复数组的值:

repeat(a, repeats, axis=None)

axis:为0则表示垂直(行数增加),为1表示水平(列数增加)

print(np.repeat(a1, 3, axis=1))
print(np.repeat(a1, 3, axis=0))
----------
[[16 16 16 18 18 18]
 [13 13 13 11 11 11]
 [11 11 11 13 13 13]
 [13 13 13 10 10 10]
 [11 11 11 15 15 15]]
[[16 18]
 [16 18]
 [16 18]
 [13 11]
 [13 11]
 [13 11]
 [11 13]
 [11 13]
 [11 13]
 [13 10]
 [13 10]
 [13 10]
 [11 15]
 [11 15]
 [11 15]]

2.3.3 常用统计函数

基本统计函数:

  • min ,max amax, amin:表示求得最大值和最小值
  • ptp:求最值差(最大值与最小值之差)
  • percentile:求分位数

表示数据波动函数:

  • median:求中位数

  • mean:求算数平均值

  • average:求加权平均值

  • var:方差

  • std:标准方差

数据分布密度函数:

  • histogram
  • bincout

数据相关性函数:判断两个数组是否具有一定的一致性

  • cov:协方差
  • corrcoef:协方差系数

求值函数:

  • sum:求数组所有元素之和
  • cumsum:求数组到某位置的累加和
  • prod:所有元素之积
  • cumprod:数组到某位置的累乘值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/1542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统(1.3)--习题

一、课堂习题 1、一个作业第一 次执行时用了5min ,而第二次执行时用了6min,这说明了操作系统的( )特点。 A、并发性 B、共享性 C、虚拟性 D、不确定性 D 2、在计算机系统中,操作系统是( )。 A、处于裸机之上的第一层软件 B、处于硬件之下的低层软件 C、处于应用软件之上的系统软…

对象的创建以及数组中常见的属性与方法

(一)对象创建的三种方法 1、利用对象字面量创建对象 const obj{ name:小开心 } 2、利用new Object创建对象 const obj1new Object({ name:小开心 }) 3、利用构造函数创建对象 构造函数:是一种特殊的函数,主要用来初始化对象&…

Vector的扩容机制

到需要扩容的时候,Vector会根据需要的大小,创建一个新数组,然后把旧数组的元素复制进新数组。 我们可以看到,扩容后,其实是一个新数组,内部元素的地址已经改变了。所以扩容之后,原先的迭代器会…

【Spring事务】声明式事务 使用详解

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 声明式事务一、编程式事务二、声明式事务&…

PMSM矢量控制笔记(1.1)——电机的机械结构与运行原理

前言:重新整理以前的知识和文章发现,仍然有许多地方没有学得明白,懵懵懂懂含含糊糊的地方多如牛毛,尤其是到了真正实际写东西或者做项目时,如果不是系统的学习了知识,很容易遇到问题就卡壳,也想…

C语言的灵魂---指针(基础)

C语言灵魂指针1.什么是指针?2.指针的大小3.指针的分类3.1比较常规的指针类型3.2指针的解引用操作3.3野指针野指针的成因:4.指针运算4.1指针加减整数4.2指针-指针1.什么是指针? 这个问题我们通常解释为两种情况: 1.指针本质&#…

Unity学习日记13(画布相关)

目录 创建画布 对画布的目标图片进行射线检测 拉锚点 UI文本框使用 按钮 按钮导航 按钮触发事件 输入框 实现单选框 下拉菜单 多选框选项加图片 创建画布 渲染模式 第一个,保持画布在最前方,画布内的内容显示优先级最高。 第二个,…

GitHub 上有些什么好玩的项目?

前言 各个领域模块的都整理了一下,包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目,希望他们可以给你学习的路上增加几分的乐趣,我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例,包括地图绘制、玩家控…

并发基础之线程池(Thread Pool)

目录前言何为线程池线程池优势创建线程池方式直接实例化ThreadPoolExecutor类JUC Executors 创建线程池线程池挖掘Executors简单介绍ThreadPoolExecutor核心类ThreadPoolExecutor 类构造参数含义线程池运行规则线程设置数量结语前言 相信大家都知道当前的很多系统架构都要求高…

echart图表之highcharts

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、HighCharts是什么?二、使用步骤1.引入库2.前端代码3.展现结果4.后台自动截图总结前言 提示:这里可以添加本文要记录的大概内容&…

linux kernel 5.0 inline hook框架

github:https://github.com/WeiJiLab/kernel-hook-framework 一、项目介绍 Usually we want to hack a kernel function, to insert customized code before or after a certain kernel function been called, or to totally replace a function with new one. How can we…

计算机图形学11:二维观察之多边形的裁剪

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、多边形的裁剪…

Activity工作流(三):Service服务

3. Service服务 所有的Service都通过流程引擎获得。 3.1 RepositoryService 仓库服务是存储相关的服务,一般用来部署流程文件,获取流程文件(bpmn和图片),查询流程定义信息等操作,是引擎中的一个重要的服务。…

Anaconda配置Python新版本tensorflow库(CPU、GPU通用)的方法

本文介绍在Anaconda环境中,下载并配置Python中机器学习、深度学习常用的新版tensorflow库的方法。 在之前的两篇文章基于Python TensorFlow Estimator的深度学习回归与分类代码——DNNRegressor(https://blog.csdn.net/zhebushibiaoshifu/article/detail…

【C++学习】日积月累——SLT中stack使用详解(1)

一、stack的相关概念 stack是一种容器适配器,专门用在具有后进先出的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作; stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提…

图形视图框架的坐标

图形视图基于笛卡尔坐标系;项目在场景中的位置和几何图形由两组数字表示:X 坐标和 Y 坐标。使用未变换的视图观察场景时,场景上的一个单元由屏幕上的一个像素表示。 图形视图中有三种有效的坐标系: 项目坐标场景坐标视图坐标为了简化实现图形…

opencv仿射变换之获取变换矩阵

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

JavaSe第10次笔记

1.Java中,static不能修饰局部变量。 2.构造代码块:可用于成员变量的赋值,但需要注意的是,构造代码块最先执行(比构造方法先)。 3.静态代码块(可用于静态成员变量赋值):写法如下 static { 静态成员操作; } (比构造…

Python逆向及相关知识

今天第二次看见python字节码的逆向题,然后发现了一个介绍Python逆向的文章,所以把文章里的内容简单整理记录一下。 文章参考:https://www.cnblogs.com/blili/p/11799398.html Python运行原理: 一.什么是Python Python 是一种解…

ChatGPT加强版GPT-4面世,打工人的方式将被颠覆

🔗 运行环境:chatGPT,GPT-4 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好&#…
最新文章