小y同学
2023/03/21阅读:108主题:全栈蓝
Python基于NumPy模块的矩阵运算
「由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~」
NumPy 是基于 c 语言而编写的一个开源的 Python 科学计算库,使用 NumPy,就可以很自然地使用数组和矩阵,其存储效率和输入输出性能远远优于 Python 中等价的基本数据结构,同样的数值计算任务,使用 NumPy 要比直接编写 Python 代码便捷得多。NumPy 包含了很多很实用的 NumPy 数学函数,涵盖线性代数、傅里叶变换等功能,因此 NumPy 深受许多开发者的喜爱。
本文根据 Python 的 NumPy 模块,整理了一些常见的矩阵操作。本文所有代码都是基于import numpy as np
导入了 numpy 语句而书写。
1 定义矩阵
-
直接创建矩阵
创建一个矩阵可以直接对列表对象转化,也可以对字符串对象进行转化(G 格式和 matlab 一致)
-
列表转化为矩阵
# 创建一维行向量
a = np.array([1, 2, 3])
# 创建二维矩阵
b = np.array([[1, 2, 3], [4, 5, 6]])
print("a:", a)
print("b:", b)
输出结果:
-
字符串转矩阵
# 像matlab那样不同行用分号隔开
b1 = np.mat("1 2 3;4 5 6;7 8 9")
print("b1:", b1)
输出结果:
-
利用函数创建矩阵
NumPy 提供有很方便创建全 0 矩阵、单位矩阵、随机矩阵的函数。
-
创建全 0 矩阵
c = np.zeros((3, 3))
print("c:", c)
输出结果:
-
创建单位矩阵
d = np.eye(3)
print("d:", d)
输出结果:
-
创建全 1 矩阵
e = np.ones((3, 3))
print("e:", e)
输出结果:
-
创建指定大小的随机矩阵(int 类型)
# (初始值,结束值,大小)
f = np.random.randint(1, 10, (2, 3))
print("f:", f)
输出结果:
-
创建指定大小的随机矩阵
g = np.random.random((3, 3))
print("g:", g)
输出结果:
2 矩阵运算
-
矩阵元素的加减乘除
这里要注意的是矩阵之间直接使用四则运算符号+
-
*
/
代表的是两个矩阵对应元素的四则运算,所以传入的矩阵一定要大小相等。我们可以使用a.shape
查看矩阵的大小。
h = np.array([[1, 2, 3], [4, 5, 6]])
g = np.array([[7, 8, 9], [10, 11, 12]])
print("h+g:", h + g) # 加
print("h-g:", h - g) # 减
print("h*g:", h * g) # 乘
print("h/g:", h / g) # 除
输出结果:
-
矩阵的转置
h = np.array([[1, 2, 3], [4, 5, 6]])
print("h的转置", h.T)
输出结果:
-
矩阵的点乘
这里介绍了三种矩阵点乘的方式,实际编程中我们只需要选择掌握一种即可。
h = np.array([[1, 2, 3], [4, 5, 6]])
g = np.array([[7, 8, 9], [10, 11, 12]])
print("h点乘(g的转置)", np.dot(h, g.T))
print("h点乘(g的转置)", h.dot(g.T))
print("h点乘(g的转置)", np.matmul(h, g.T))
输出结果:

-
矩阵的数乘
h = np.array([1, 1, 3])
print("矩阵数乘:", h * 3)
输出结果:
-
矩阵的范数
i = np.array([0, 1, -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))
输出结果:
-
矩阵内积
j = np.array([0, 1, -1])
k = np.array([1, 0, 1])
print("j与k的内积:", np.inner(j, k))
输出结果:
-
矩阵求逆
l = np.random.randint(1, 10, (3, 3))
print("l:", l)
print("l的逆:", np.linalg.inv(l))
输出结果:
-
矩阵求特征值
使用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)
输出结果:
-
计算行列式
计算矩阵行列式时,要注意矩阵是否是方阵。
n = np.random.randint(1, 10, (2, 2))
print("n:", n)
print("n的行列式:", np.linalg.det(n))
输出结果:
3 其他常用函数
-
计算算数平均值
o = np.array([[1, 2, 3], [4, 5, 6]])
print("o的平均值:", np.mean(o))
输出结果:
-
计算方差
p = np.array([[1, 2, 3], [4, 5, 6]])
print("p的方差:", np.var(p))
输出结果:
-
获取最大值最小值
NumPy 提供有最大值最小值获取函数,可以很方便的获取一个矩阵的最值,从而便于进行区间中点的计算等操作。
p = np.array([[1, 2, 3], [4, 5, 6]])
print("最大值", np.min(p))
print("最小值", np.max(p))
输出结果:
-
矩阵的垂直与水平组合
使用 vstack 函数可以将两个数组进行垂直方向的合并,使用 hstack 函数可以将两个数组进行水平方向的合并。
q = np.array([[1, 2], [3, 4]])
r = np.array([[5, 6], [7, 8]])
print("垂直组合:", np.vstack((q, r)))
print("水平组合:", np.hstack((q, r)))
输出结果:
4.小结
NumPy 模块的内容不仅仅局限于此,想要了解更过的 numpy 模块使用知识,请参考NumPy 参考手册 | NumPy同时也欢迎读者的宝贵建议与支持!
「本公众号的原创成果,在未经允许的情况下,请勿用于任何商业用途!」
「您的点赞、收藏与关注是我创作的最大动力!」

作者介绍