NumPy - 线性代数

NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能。 此模块中的一些重要功能如下表所述。

序号 函数及描述
1. dot 两个数组的点积
2. vdot 两个向量的点积
3. inner 两个数组的内积
4. matmul 两个数组的矩阵积
5. determinant 数组的行列式
6. solve 求解线性矩阵方程
7. inv 寻找矩阵的乘法逆矩阵

numpy.dot()

此函数返回两个数组的点积。 对于二维向量,其等效于矩阵乘法。 对于一维数组,它是向量的内积。 对于 N 维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。

  1. import numpy.matlib
  2. import numpy as np
  3. a = np.array([[1,2],[3,4]])
  4. b = np.array([[11,12],[13,14]])
  5. np.dot(a,b)

输出如下:

  1. [[37 40]
  2. [85 92]]

要注意点积计算为:

  1. [[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]

numpy.vdot()

此函数返回两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数id是多维数组,它会被展开。

例子

  1. import numpy as np
  2. a = np.array([[1,2],[3,4]])
  3. b = np.array([[11,12],[13,14]])
  4. print np.vdot(a,b)

输出如下:

  1. 130

注意:1*11 + 2*12 + 3*13 + 4*14 = 130

numpy.inner()

此函数返回一维数组的向量内积。 对于更高的维度,它返回最后一个轴上的和的乘积。

例子

  1. import numpy as np
  2. print np.inner(np.array([1,2,3]),np.array([0,1,0]))
  3. # 等价于 1*0+2*1+3*0

输出如下:

  1. 2

例子

  1. # 多维数组示例
  2. import numpy as np
  3. a = np.array([[1,2], [3,4]])
  4. print '数组 a:'
  5. print a
  6. b = np.array([[11, 12], [13, 14]])
  7. print '数组 b:'
  8. print b
  9. print '内积:'
  10. print np.inner(a,b)

输出如下:

  1. 数组 a
  2. [[1 2]
  3. [3 4]]
  4. 数组 b
  5. [[11 12]
  6. [13 14]]
  7. 内积:
  8. [[35 41]
  9. [81 95]]

上面的例子中,内积计算如下:

  1. 1*11+2*12, 1*13+2*14
  2. 3*11+4*12, 3*13+4*14

numpy.matmul

numpy.matmul()函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

例子

  1. # 对于二维数组,它就是矩阵乘法
  2. import numpy.matlib
  3. import numpy as np
  4. a = [[1,0],[0,1]]
  5. b = [[4,1],[2,2]]
  6. print np.matmul(a,b)

输出如下:

  1. [[4 1]
  2. [2 2]]

例子

  1. # 二维和一维运算
  2. import numpy.matlib
  3. import numpy as np
  4. a = [[1,0],[0,1]]
  5. b = [1,2]
  6. print np.matmul(a,b)
  7. print np.matmul(b,a)

输出如下:

  1. [1 2]
  2. [1 2]

例子

  1. # 维度大于二的数组
  2. import numpy.matlib
  3. import numpy as np
  4. a = np.arange(8).reshape(2,2,2)
  5. b = np.arange(4).reshape(2,2)
  6. print np.matmul(a,b)

输出如下:

  1. [[[2 3]
  2. [6 11]]
  3. [[10 19]
  4. [14 27]]]

numpy.linalg.det()

行列式在线性代数中是非常有用的值。 它从方阵的对角元素计算。 对于 2×2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。

换句话说,对于矩阵[[a,b],[c,d]],行列式计算为ad-bc。 较大的方阵被认为是 2×2 矩阵的组合。

numpy.linalg.det()函数计算输入矩阵的行列式。

例子

  1. import numpy as np
  2. a = np.array([[1,2], [3,4]])
  3. print np.linalg.det(a)

输出如下:

  1. -2.0

例子

  1. b = np.array([[6,1,1], [4, -2, 5], [2,8,7]])
  2. print b
  3. print np.linalg.det(b)
  4. print 6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2)

输出如下:

  1. [[ 6 1 1]
  2. [ 4 -2 5]
  3. [ 2 8 7]]
  4. -306.0
  5. -306

numpy.linalg.solve()

numpy.linalg.solve()函数给出了矩阵形式的线性方程的解。

考虑以下线性方程:

  1. x + y + z = 6
  2. 2y + 5z = -4
  3. 2x + 5y - z = 27

可以使用矩阵表示为:

NumPy - 线性代数 - 图1

如果矩阵成为AXB,方程变为:

  1. AX = B

  1. X = A^(-1)B

numpy.linalg.inv()

我们使用numpy.linalg.inv()函数来计算矩阵的逆。 矩阵的逆是这样的,如果它乘以原始矩阵,则得到单位矩阵。

例子

  1. import numpy as np
  2. x = np.array([[1,2],[3,4]])
  3. y = np.linalg.inv(x)
  4. print x
  5. print y
  6. print np.dot(x,y)

输出如下:

  1. [[1 2]
  2. [3 4]]
  3. [[-2. 1. ]
  4. [ 1.5 -0.5]]
  5. [[ 1.00000000e+00 1.11022302e-16]
  6. [ 0.00000000e+00 1.00000000e+00]]

例子

现在让我们在示例中创建一个矩阵A的逆。

  1. import numpy as np
  2. a = np.array([[1,1,1],[0,2,5],[2,5,-1]])
  3. print '数组 a:'
  4. print a
  5. ainv = np.linalg.inv(a)
  6. print 'a 的逆:'
  7. print ainv
  8. print '矩阵 b:'
  9. b = np.array([[6],[-4],[27]])
  10. print b
  11. print '计算:A^(-1)B:'
  12. x = np.linalg.solve(a,b)
  13. print x
  14. # 这就是线性方向 x = 5, y = 3, z = -2 的解

输出如下:

  1. 数组 a
  2. [[ 1 1 1]
  3. [ 0 2 5]
  4. [ 2 5 -1]]
  5. a 的逆:
  6. [[ 1.28571429 -0.28571429 -0.14285714]
  7. [-0.47619048 0.14285714 0.23809524]
  8. [ 0.19047619 0.14285714 -0.0952381 ]]
  9. 矩阵 b
  10. [[ 6]
  11. [-4]
  12. [27]]
  13. 计算:A^(-1)B
  14. [[ 5.]
  15. [ 3.]
  16. [-2.]]

结果也可以使用下列函数获取

  1. x = np.dot(ainv,b)