numpy中的线性代数内容
- 矩阵乘法
- 内积
- 矩阵对应位置相乘
- 矩阵的逆
- 求线性方程组的解
- 求行列式
- 特征向量和特征值
- 矩阵对角化
1. 矩阵乘法 np.dot(a,b) 和 np.matmul(a,b)
两者只有在a,b能否为标量上有区别,其他都基本相同。
np.matmul(a,b)是严格数学意义上的矩阵乘法,输入必须是arrays,标量是不允许的。
np.dot(a,b) 是允许a,b是标量的,不妨称之为广义上的矩阵乘法a*b,排除标量的情形,两者运算的前提条件可以简单概括为:a的列数要等于b的行数
但是当a,b分别为一维向量的时候,有会有些不同,但是总体上来说仍然是满足上述规则。有三种情况
n p . d o t ( a , b ) = { a 是 常 数 : b 的 维 数 没 有 任 何 限 制 a 是 向 量 : 如 果 l e n ( a ) = l e n ( b ) a 是 矩 阵 : 如 果 l e n ( a [ 0 ] ) = l e n ( b ) np.dot(a,b) = \begin{cases} a是常数: & b的维数没有任何限制\\ a是向量: & 如果 len(a) = len(b) \\ a是矩阵: & 如果 len(a[0]) = len(b) \\ \end{cases} np.dot(a,b)=⎩⎪⎨⎪⎧a是常数:a是向量:a是矩阵:b的维数没有任何限制如果len(a)=len(b)如果len(a[0])=len(b)
n p . m a t m u l ( a , b ) = { a 是 常 数 : 不 可 以 , a , b 都 必 须 是 数 组 a 是 向 量 : 如 果 l e n ( a ) = l e n ( b ) a 是 矩 阵 : 如 果 l e n ( a [ 0 ] ) = l e n ( b ) np.matmul(a,b) = \begin{cases} a是常数: & 不可以,a,b都必须是数组\\ a是向量: & 如果 len(a) = len(b) \\ a是矩阵: & 如果 len(a[0]) = len(b) \\ \end{cases} np.matmul(a,b)=⎩⎪⎨⎪⎧a是常数:a是向量:a是矩阵:不可以,a,b都必须是数组如果len(a)=len(b)如果len(a[0])=len(b)
1.1 a为常数时
a为常数时,np.dot(a, b)相当于对b中的每个元素都乘以a
import numpy as np
a = 2
b = np.array([[1,2],[3,4]])
np.dot(a, b), np.dot(b, a)
(array([[2, 4],
[6, 8]]),
array([[2, 4],
[6, 8]]))
np.matmul(a,b) ## -> 不可以, a,b必须是arrays
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-61-aaf37998a60c> in <module>
----> 1 np.matmul(a,b) ## -> 不可以
ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
1.2 a为向量时
np.dot(a,b)可行的前提条件是:len(a) == len(b)
乘法结果维度是 R 1 × l e n ( b [ 0 ] ) R^{1\times len(b[0])} R1×len(b[0]), 乘法过程是a中第i个元素乘以b中的第i个中括号内元素,得到一个和b[0]一样长度的向量,然后将所有这样的向量相加即可得到结果。即 c = ∑ i = 0 l e n ( a ) a [ i ] × b [ i ] c = \sum_{i=0}^{len(a)}a[i]\times b[i] c=∑