numpy.linalg学习
矩阵和向量积
两个数组点积
numpy.dot(a, b, out=None)
a、b都是常量或一维数组,则返回标量
对于一维数组,其结果等于两向量的内积:设向量 $a=(x_1, y_1)$,向量$b=(x_2, y_2)$,结果等于$x_1x_2 + y_1y_2$
import numpy as np
r1 = np.dot(3, 4)
r2 = np.dot([1, 2, 3], [4, 5, 6])
print(r1) # 12
print(r2) # 32
a、b都是二维数组,相当于矩阵的乘法
矩阵乘法,第一个矩阵$A$的行数必须等于第二个矩阵$B$的列数;矩阵$A$乘以矩阵$B$得到的结果矩阵$C$,其第m行n列元素等于矩阵$A$的第m行元素乘以矩阵$B$第n列对应元素之和。
import numpy as np
a = np.array([[1, 2], [3, 4], [2, 5]])
b = np.array([[2, 3, 1], [4, 5, 2]])
c = np.dot(a, b)
print(c)
'''
[[10 13 5]
[22 29 11]
[24 31 12]]
'''
a、b都是N维,其结果等于a的最后一轴和b的倒数第二轴积之和
import numpy as np
a = np.array(range(12)).reshape(2, 3, 1, 2)
b = np.array(range(12)).reshape(3, 2, 2)
np.dot(a, b)
print(a)
print(b)
print(c)
print(c.shape)
'''
[[[[ 0 1]]
[[ 2 3]]
[[ 4 5]]]
[[[ 6 7]]
[[ 8 9]]
[[10 11]]]]
[[[ 0 1]
[ 2 3]]
[[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]]]
[[[[[ 2 3]
[ 6 7]
[ 10 11]]]
[[[ 6 11]
[ 26 31]
[ 46 51]]]
[[[ 10 19]
[ 46 55]
[ 82 91]]]]
[[[[ 14 27]
[ 66 79]
[118 131]]]
[[[ 18 35]
[ 86 103]
[154 171]]]
[[[ 22 43]
[106 127]
[190 211]]]]]
(2, 3, 1, 3, 2)
'''
两向量点积
numpy.vdot(a, b)
参数a、b都是高维数组
vdot处理多维数组和dot处理方式不同,不是执行矩阵乘积,只能执行向量点积,则需将数组先扁平化,然后再计算
import numpy as np
a = np.array([[1, 4], [5, 6]])
b = np.array([[4, 1], [2, 2]])
c = np.vdot(a, b)
print(c)
# a、b数组扁平化即将多维数组转换成一维数组,可以使用ravel函数处理
c = np.vdot(a.ravel(), b.ravel())
print(c)
'''
30
30
'''
参数a、b为复数
import numpy as np
a = np.array([1+2j, 3+4j])
b = np.array([5+6j, 7+8j])
c = np.vdot(a, b)
print(c)
c = np.vdot(b, a)
print(c)
'''
(70-8j)
(70+8j)
'''
通过上述结果可知:np.vdot(a,b)
和np.vdot(b,a)
计算出来的结果刚好互为共轭复数关系(实部相同,虚部互为相反数),其计算结果为取vdot函数中的第一个参数的共轭复数与另外一个参数点积。
以np.vdot(a,b)计算为例:
第一步:计算a的共轭复数
c = np.array([1-2j, 3-4j])
第二步:计算c与b的点积
import numpy as np
a = np.array([1+2j, 3+4j])
b = np.array([5+6j, 7+8j])
c = np.array([1-2j, 3-4j])
d = np.array([5-6j, 7-8j])
np.dot(c, b)
np.dot(d, a)
'''
(70-8j)
(70+8j)
'''
求解方程与求逆矩阵
逆矩阵
numpy.linalg.inv(a)
import numpy as np
from numpy.linalg import inv
a = np.array([[1., 2.], [3., 4.]])
b = inv(a)
print(b)
c = np.dot(a, b)
print(c)
# 比较两数组: np.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
e = np.allclose(c, np.eye(2))
print(e)
'''
[[-2. 1. ]
[ 1.5 -0.5]]
[[1.0000000e+00 0.0000000e+00]
[8.8817842e-16 1.0000000e+00]]
True
'''
知识点:矩阵与其逆矩阵点积等于同阶单位矩阵,求解逆矩阵的方法有待定系数法、伴随矩阵法、初等变换法
最小二乘法
numpy.linalg.lstsq(a, b, rcond=-1)
b为一维数组
import numpy as np
from numpy.linalg import lstsq
X = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]])
Y = np.array([[7], [9], [13], [17.5], [18]])
z = np.linalg.lstsq(X, Y, rcond=None)
print(z)
'''
(array([[1.1875 ],
[1.01041667],
[0.39583333]]), array([8.22916667]), 3, array([26.97402951, 2.46027806, 0.59056212]))
'''
从上述结果可知:返回元组,元组中四个元素,第一元素表示所求的最小二乘解,第二个元素表示残差总和,第三个元素表示X矩阵秩,第四个元素表示Y的奇异值
b为多维数组
import numpy as np
from numpy.linalg import lstsq
X = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]])
Y = np.array([[7, 8], [9, 7], [13, 10], [17.5, 16], [18, 17]])
z = np.linalg.lstsq(X, Y, rcond=None)
print(z)
'''
(array([[ 1.1875 , -1.125 ],
[ 1.01041667, 1.02083333],
[ 0.39583333, 1.29166667]]), array([8.22916667, 2.91666667]), 3, array([26.97402951, 2.46027806, 0.59056212]))
'''
通过上面两个结果对比分析:参数b维度增加,第一个、第二个元素数组维度也变化,其对应的第k列分别表示对b数组中第k列的最小二乘法求解、残差总和
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/numpy-linalg-learning/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论