Python中numpy.linalg库常用函数

Python中numpy.linalg库常用函数

numpy.linalg

  • Python中numpy.linalg库常用函数
    • 简单记录所遇到的numpy库内置函数
    • 矩阵与向量积
      • ①np.linalg.dot() 两组数组的点积
      • ②numpy.vdot(a,b) 返回两个向量的点积
      • ③np.inner(a,b) np.outer(a,b) 计算向量或矩阵的内积 外积
      • ④numpy.matmul() 计算矩阵的乘积
    • 矩阵规范
      • ①np.linalg.inv() 求矩阵A的逆
      • ②np.linalg.eigvals() 求特征值
      • ③np.linalg.det() 求行列式
      • ④np.linalg.norm() 求范数
      • ⑤numpy.linalg.slogdet(a) 计算行列式的符号和自然对数

简单记录所遇到的numpy库内置函数

########################线性代数部分######################
numpy.linalg模块包含了线性代数有关函数,使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。

矩阵与向量积

①np.linalg.dot() 两组数组的点积

如果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]]

②numpy.vdot(a,b) 返回两个向量的点积

如果第一个参数是复数,则使用第一个参数的共轭复数来计算点积。
输出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

③np.inner(a,b) np.outer(a,b) 计算向量或矩阵的内积 外积

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() 计算矩阵的乘积

形式:
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)

矩阵规范

①np.linalg.inv() 求矩阵A的逆

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]]]

②np.linalg.eigvals() 求特征值

计算特征值但是不返回特征值。而eig函数可以返回一个包含特征值和对应的特征向量的元组

from numpy import linalg as LA
import numpy as np
D = np.diag((-1,1))
print(LA.eigvals(D))

运行结果:

[-1.  1.]

③np.linalg.det() 求行列式

可以同时求多个矩阵的求行列式,返回一个数组

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() 求范数

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

⑤numpy.linalg.slogdet(a) 计算行列式的符号和自然对数

如果数组具有非常大或者非常小的行列式,使用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.]

你可能感兴趣的:(Python杂记,numpy,python)