小y同学

V1

2023/03/21阅读:108主题:全栈蓝

Python基于NumPy模块的矩阵运算

由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~


NumPy 是基于 c 语言而编写的一个开源的 Python 科学计算库,使用 NumPy,就可以很自然地使用数组和矩阵,其存储效率和输入输出性能远远优于 Python 中等价的基本数据结构,同样的数值计算任务,使用 NumPy 要比直接编写 Python 代码便捷得多。NumPy 包含了很多很实用的 NumPy 数学函数,涵盖线性代数、傅里叶变换等功能,因此 NumPy 深受许多开发者的喜爱。

本文根据 Python 的 NumPy 模块,整理了一些常见的矩阵操作。本文所有代码都是基于import numpy as np导入了 numpy 语句而书写。


1 定义矩阵

  1. 直接创建矩阵

创建一个矩阵可以直接对列表对象转化,也可以对字符串对象进行转化(G 格式和 matlab 一致)

  • 列表转化为矩阵
  # 创建一维行向量
  a = np.array([123])

  # 创建二维矩阵
  b = np.array([[123], [456]])
  print("a:", a)
  print("b:", b)

输出结果:

  • 字符串转矩阵
# 像matlab那样不同行用分号隔开
b1 = np.mat("1 2 3;4 5 6;7 8 9")
print("b1:", b1)

输出结果:

  1. 利用函数创建矩阵

NumPy 提供有很方便创建全 0 矩阵、单位矩阵、随机矩阵的函数。

  • 创建全 0 矩阵
c = np.zeros((33))
print("c:", c)

输出结果:

  • 创建单位矩阵
d = np.eye(3)
print("d:", d)

输出结果:

  • 创建全 1 矩阵
e = np.ones((33))
print("e:", e)

输出结果:

  • 创建指定大小的随机矩阵(int 类型)
# (初始值,结束值,大小)
f = np.random.randint(110, (23))
print("f:", f)

输出结果:

  • 创建指定大小的随机矩阵
g = np.random.random((33))
print("g:", g)

输出结果:


2 矩阵运算

  1. 矩阵元素的加减乘除

这里要注意的是矩阵之间直接使用四则运算符号+ - * /代表的是两个矩阵对应元素的四则运算,所以传入的矩阵一定要大小相等。我们可以使用a.shape查看矩阵的大小。

h = np.array([[123], [456]])
g = np.array([[789], [101112]])
print("h+g:", h + g)  # 加
print("h-g:", h - g)  # 减
print("h*g:", h * g)  # 乘
print("h/g:", h / g)  # 除

输出结果:

  1. 矩阵的转置
h = np.array([[123], [456]])
print("h的转置", h.T)

输出结果:

  1. 矩阵的点乘

这里介绍了三种矩阵点乘的方式,实际编程中我们只需要选择掌握一种即可。

h = np.array([[123], [456]])
g = np.array([[789], [101112]])
print("h点乘(g的转置)", np.dot(h, g.T))
print("h点乘(g的转置)", h.dot(g.T))
print("h点乘(g的转置)", np.matmul(h, g.T))

输出结果:

  1. 矩阵的数乘
h = np.array([113])
print("矩阵数乘:", h * 3)

输出结果:

  1. 矩阵的范数
i = np.array([01-1])
print("L^2-范数", np.linalg.norm(i, 2))
print("L^5-范数", np.linalg.norm(i, 5))
print("L^10-范数", np.linalg.norm(i, 10))

输出结果:

  1. 矩阵内积
j = np.array([01-1])
k = np.array([101])
print("j与k的内积:", np.inner(j, k))

输出结果:

  1. 矩阵求逆
l = np.random.randint(110, (33))
print("l:", l)
print("l的逆:", np.linalg.inv(l))

输出结果:

  1. 矩阵求特征值

使用eigvals函数可以获取矩阵的特征值,使用eig函数可以获取矩阵的特征值和特征向量,其返回的是一个二元组,第0个元素是特征值,第1个元素是特征向量。

m = np.mat("3 -2;1 0")
print("m的特征值:", np.linalg.eigvals(m))
# eig求特征值与特征向量,返回元组
m_tem1, m_tem2 = np.linalg.eig(m)
print("m的特征向量:",m_tem2)

输出结果:

  1. 计算行列式

计算矩阵行列式时,要注意矩阵是否是方阵。

n = np.random.randint(110, (22))
print("n:", n)
print("n的行列式:", np.linalg.det(n))

输出结果:


3 其他常用函数

  1. 计算算数平均值
o = np.array([[123], [456]])
print("o的平均值:", np.mean(o))

输出结果:

  1. 计算方差
p = np.array([[123], [456]])
print("p的方差:", np.var(p))

输出结果:

  1. 获取最大值最小值

NumPy 提供有最大值最小值获取函数,可以很方便的获取一个矩阵的最值,从而便于进行区间中点的计算等操作。

p = np.array([[123], [456]])
print("最大值", np.min(p))
print("最小值", np.max(p))

输出结果:

  1. 矩阵的垂直与水平组合

使用 vstack 函数可以将两个数组进行垂直方向的合并,使用 hstack 函数可以将两个数组进行水平方向的合并。

q = np.array([[12], [34]])
r = np.array([[56], [78]])
print("垂直组合:", np.vstack((q, r)))
print("水平组合:", np.hstack((q, r)))

输出结果:

4.小结

NumPy 模块的内容不仅仅局限于此,想要了解更过的 numpy 模块使用知识,请参考NumPy 参考手册 | NumPy同时也欢迎读者的宝贵建议与支持!


本公众号的原创成果,在未经允许的情况下,请勿用于任何商业用途!

您的点赞、收藏与关注是我创作的最大动力!


分类:

后端

标签:

后端

作者介绍

小y同学
V1