📜  Numpy 线性代数

📅  最后修改于: 2020-04-19 12:47:49             🧑  作者: Mango

Numpy的线性代数模块提供了多种将线性代数应用于任何numpy数组的方法。
可以找到:

  • 数组的等级,行列式,迹等。
  • 矩阵的特征值
  • 矩阵和向量乘积(点,内,外等乘积),矩阵求幂
  • 解决线性或张量方程等等!
    # 将numpy导入为np
    import numpy as np
    A = np.array([[6, 1, 1],
                  [4, -2, 5],
                  [2, 8, 7]])
    # 矩阵的
    print("A的:", np.linalg.matrix_rank(A))
    print("\nA的:", np.trace(A))
    # 矩阵的行列式
    print("\nA的行列式:", np.linalg.det(A))
    # 矩阵A的逆
    print("\n矩阵A的逆:\n", np.linalg.inv(A))
    print("\n矩阵A的3次方:\n",
               np.linalg.matrix_power(A, 3))

输出:

"A的: 3
A的: 11
A的行列式: -306.0
矩阵A的逆:
 [[ 0.17647059 -0.00326797 -0.02287582]
 [ 0.05882353 -0.13071895  0.08496732]
 [-0.11764706  0.1503268   0.05228758]]
矩阵A的3次方:
 [[336 162 228]
 [406 162 469]
 [698 702 905]]

矩阵特征值函数

numpy.linalg.eigh(a,UPLO =’L’):此函数用于返回复杂的Hermitian(共轭对称)或实对称矩阵的特征值和特征向量,返回两个对象,一个包含的特征值,以及相应特征向量的二维平方数组或矩阵(取决于输入类型)。

# Python程序解释eigh()函数
from numpy import linalg as eigen
# 使用array函数创建数组
a = np.array([[1, -2j], [2j, 5]])
print("数组为 :",a)
# 使用eigh()函数计算特征值
c, d = eigen.eigh(a)
print("特征值:", c)
print("特征值 :", d)

输出:

数组为 : [[ 1.+0.j,  0.-2.j],
                [ 0.+2.j,  5.+0.j]]
特征值 : [ 0.17157288,  5.82842712]
特征值 : [[-0.92387953+0.j , -0.38268343+0.j ],
       [ 0.00000000+0.38268343j,  0.00000000-0.92387953j]]

numpy.linalg.eig(a):此函数用于计算正方形数组的特征值和右特征向量。

# Python程序解释eig()函数
from numpy import linalg as eigen
# 使用diag函数创建数组
a = np.diag((1, 2, 3))
print("数组为 :",a)
# 使用eig()函数计算特征值
c, d = eigen.eig(a)
print("特征值 :",c)
print("特征值 :",d)

输出:

数组为: [[1  0  0],
                 [0  2  0],
                 [0  0  3]]
特征值 : [ 1  2  3]
特征值 : [[ 1  0  0],
                 [  0  1  0],
                 [  0  0  1]]
函数 描述
linalg.eigvals() 计算通用矩阵的特征值。
linalg.eigvalsh(a [,UPLO]) 计算一个复杂的Hermitian或实对称矩阵的特征值。

矩阵和向量乘积

numpy.dot(vector_a,vector_b,out = None):返回向量a和b的点积。它可以处理2D数组,但将其视为矩阵,并将执行矩阵乘法。对于N维,它是a的最后一个轴和b的倒数第二个轴的和积:

dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

代码1:

# Python程序说明numpy.dot()方法
import numpy as eigen
# 标量
product = eigen.dot(5, 4)
print("标量值的点积  : ", product)
# 一维阵列
vector_a = 2 + 3j
vector_b = 4 + 5j
product = eigen.dot(vector_a, vector_b)
print("点积  : ", product)

输出:

标量值的点积  :  20
点积  :  (-7+22j)

代码1如何工作?

vector_a = 2 + 3j
vector_b = 4 + 5j
点积
= 2(4 + 5j) + 3j(4 - 5j)
                = 8 + 10j + 12j - 15
                = -7 + 22j

numpy.vdot(vector_a,vector_b)返回向量a和b的点积。如果第一个参数是复数,则将第一个参数的复共轭(这是方法的vdot()不同之处dot())用于点积的计算。它可以处理多维数组,但可以作为扁平数组处理。
代码1:

# Python程序说明numpy.vdot()方法
import numpy as eigen
# 一维阵列
vector_a = 2 + 3j
vector_b = 4 + 5j
product = eigen.vdot(vector_a, vector_b)
print("点积  : ", product)

输出:

点积  :  (23-2j)

代码1如何工作?

vector_a = 2 + 3j
vector_b = 4 + 5j
按照方法,取vector_a的共轭,即2-3j
现在点积= 2(4-5j)+ 3j(4-5j)
                = 8-10j + 12j + 15
                = 23-2j
函数 描述
matmul() 两个数组的矩阵乘积。
inner() 两个数组的内积。
outer() 计算两个向量的外积。
linalg.multi_dot() 在一个函数调用中计算两个或多个数组的点积,同时自动选择最快的评估顺序。
tensordot() 沿指定轴计算> = 1-D的张量点积。
einsum() 在操作数上评估爱因斯坦求和约定。
einsum_path() 通过考虑创建中间数组来评估einsum表达式的最低成本收缩顺序。
linalg.matrix_power() 将矩阵提的每个元素,计算n(整数)次幂。
kron() 两个阵列的Kronecker乘积。

求解方程和求逆矩阵

numpy.linalg.solve():求解线性矩阵方程或线性标量方程组。计算确定的(即满秩)线性矩阵方程ax = b的“精确”解x。

# Python程序说明numpy.linalg.solve()方法
import numpy as np
# 使用array函数创建数组
a = np.array([[1, 2], [3, 4]])
# 使用array函数创建数组
b = np.array([8, 18])
print(("线性方程的解:",
      np.linalg.solve(a, b)))

输出:

线性方程的解: [ 2.  3.]

numpy.linalg.lstsq():将最小二乘解返回线性矩阵方程。通过计算最小化欧几里德2-范数的向量x来解决方程ax = b。该方程可以是欠确定的,良好确定的或过度确定的(即a的线性独立行的数量可以小于,等于或大于其线性独立列的数量)。如果a为平方且为全秩,则x(但针对四舍五入误差)是方程式的“精确”解。

# Python程序说明numpy.linalg.lstsq()方法
import numpy as np
import matplotlib.pyplot as plt
# x坐标
x = np.arange(0, 9)
A = np.array([x, np.ones(9)])
# 线性产生的序列
y = [19, 20, 20.5, 21.5, 22, 23, 23, 25.5, 24]
# 获得回归线的参数
w = np.linalg.lstsq(A.T, y)[0]
# 画线
line = w[0]*x + w[1] # regression line
plt.plot(x, line, 'r-')
plt.plot(x, y, 'o')
plt.show()

输出:

函数 描述
numpy.linalg.tensorsolve() 对x求解张量方程ax = b。
numpy.linalg.inv() 计算矩阵的(乘法)逆。
numpy.linalg.pinv() 计算矩阵的(Moore-Penrose)伪逆。
numpy.linalg.tensorinv() 计算N维数组的“逆”。

特殊函数

numpy.linalg.det():计算数组的行列式。

# Python程序说明numpy.linalg.det()方法
import numpy as np
# 使用数组方法创建数组
A = np.array([[6, 1, 1],
              [4, -2, 5],
              [2, 8, 7]])
print(("\nA的行列式:"
     , np.linalg.det(A)))

输出:

A的行列式: -306.0

numpy.trace():返回沿数组对角线的和。如果a为2 -D,则返回沿其对角线的和具有给定偏移量,即,所有元素a [i,i + offset]的和i。如果a具有多个二维,则使用axis1和axis2指定的轴来确定要返回其迹线的2-D子数组。所得数组的形状与除去了轴1和轴2的a的形状相同。

# Python程序说明numpy.trace()()方法
import numpy as np
# 使用数组方法创建数组
A = np.array([[6, 1, 1],
              [4, -2, 5],
              [2, 8, 7]])
print("\nA的迹:", np.trace(A))

输出:

A的痕迹: 11
函数 描述
numpy.linalg.norm() 矩阵或向量范数。
numpy.linalg.cond() 计算矩阵的条件数。
numpy.linalg.matrix_rank() 使用SVD方法返回数组的矩阵秩
numpy.linalg.cholesky() 胆固醇分解。
numpy.linalg.qr() 计算矩阵的qr因式分解。
numpy.linalg.svd() 奇异值分解。