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列的最小二乘法求解、残差总和

上一篇 NumPy常见运算之min、max、mean、sum、exp、sqrt、sort、乘法、点积、拼接、切分
下一篇 matplotlib之plt.subplot
目录
文章列表
1 基于Java代码进行GPG加解密
基于Java代码进行GPG加解密
2
Swift - class与staitc关键字的区别与使用(类方法、静态方法)
Swift - class与staitc关键字的区别与使用(类方法、静态方法)
3
Windows下安装Redis
Windows下安装Redis
4
AWS SFTP Transfer 下载通过S3上传的文件(非SFTP上传)权限问题
AWS SFTP Transfer 下载通过S3上传的文件(非SFTP上传)权限问题
5
高等数学基础:线性代数与矩阵
高等数学基础:线性代数与矩阵
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。