########################线性代数部分######################
numpy.linalg模块包含了线性代数有关函数,使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
如果a和b都是一维数组,则它是向量的内积(无复共轭)
如果a和b均为二维数组,则为矩阵乘法
import numpy as np
a=np.dot(3, 4)
b = [[1, 0], [0, 1]]
c = [[4, 1], [2, 2]]
A=np.dot(a, b)
print(a,A)
运行结果:
12 [[12 0]
[ 0 12]]
如果第一个参数是复数,则使用第一个参数的共轭复数来计算点积。
输出a和b的点积。根据a和b的类型,可以是int,float或complex 。
import numpy as np
a = np.array([1+2j,3+4j])
b = np.array([5+6j,7+8j])
print(np.vdot(a, b))
print(np.vdot(b, a))
x = np.array([[1, 4], [5, 6]])
y = np.array([[4, 1], [2, 2]])
print(np.vdot(x, y))
print(np.vdot(y, x))
运行结果:
(70-8j)
(70+8j)
30
30
import numpy as np
a = np.array([1,2,3])
b = np.array([0,1,0])
print(np.inner(a, b))
print(np.outer(a, b))
计算结果:
2
[[0 1 0]
[0 2 0]
[0 3 0]]
形式:
numpy.matmul(x1, x2, /, out=None, *)
x1、x2:不允许是数组或者标量
out:存储结果的位置,一般无需设置
:其他关键字
与dot有两点区别:
1、不允许使用标量乘法,使用代替。
2、Stacks of matrices are broadcast together as if the matrices were elements, respecting the signature (n,k),(k,m)->(n,m): (很难直译)
import numpy as np
a = np.ones([9, 5, 7, 4])
c = np.ones([9, 5, 4, 3])
print(np.dot(a, c).shape)
print(np.matmul(a, c).shape)
运行结果:
(9, 5, 7, 9, 5, 3)
(9, 5, 7, 3)
A必须为方阵,且此函数可以同时求多个矩阵的逆
import numpy as np
a = np.array([[[1., 2.], [3., 4.]], [[1, 3], [3, 5]]])
B=np.linalg.inv(a)
print(a)
print(B)
运行结果:
[[[1. 2.]
[3. 4.]]
[[1. 3.]
[3. 5.]]]
[[[-2. 1. ]
[ 1.5 -0.5 ]]
[[-1.25 0.75]
[ 0.75 -0.25]]]
计算特征值但是不返回特征值。而eig函数可以返回一个包含特征值和对应的特征向量的元组
from numpy import linalg as LA
import numpy as np
D = np.diag((-1,1))
print(LA.eigvals(D))
运行结果:
[-1. 1.]
可以同时求多个矩阵的求行列式,返回一个数组
import numpy as np
a = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
print(a.shape)
b=np.linalg.det(a)
print(b)
运行结果:
(3, 2, 2)
[-2. -3. -8.]
np.linalg.norm(x,order=None,axis=None,keepdims=False)
order为范数类型,默认二范数;
axis处理类型,axis=1表示按行向量处理,求多个行向量的范数axis=0表示按列向量处理,求多个列向量的范数,axis=None表示矩阵范数;
keepdims bool类型,是否保持矩阵的二维特性。
import numpy as np
a = np.array([[1, 2, 10, 15, 8]])
b=np.linalg.norm(a)
print(b)
运行结果:
19.849433241279208
如果数组具有非常大或者非常小的行列式,使用det会导致溢出,slogdet返回的是自然对数。
a:必须为一个二维方阵
返回值sign:表示行列式符号的一个数。对于实矩阵,这是1 0或-1。
返回值logdet:行列式的绝对值的自然对数。
import numpy as np
a = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
print(a)
print(a.shape)
sign, logdet = np.linalg.slogdet(a)
print(sign, logdet)
b=sign * np.exp(logdet)
print(b)
运行结果:
[[[1 2]
[3 4]]
[[1 2]
[2 1]]
[[1 3]
[3 1]]]
(3, 2, 2)
[-1. -1. -1.] [0.6931 1.0986 2.0794]
[-2. -3. -8.]