前言
N
u
m
P
y
NumPy
NumPy提供了线性代数函数库linalg ,该库包含了线性代数所需的所有功能,可以看看下面的说明。
函数 | 内容 |
---|
dot | 两数组的点积 | vdot | 两向量的点积 | inner | 两数组的内积 | determinant | 数组的行列式 | matmul | 两数组的矩阵积 | inv | 求矩阵的逆 | solve | 求解线性矩阵方程 |
相关函数介绍
numpy.dot() :numpy.dot()
numpy.vdot :numpy.vdot()
numpy.inner() :numpy.inner()
numpy.determinant() :numpy.determinant()
numpy.matmul() :numpy.matmul()
numpy.inv() :numpy.inv()
numpy.solve() :numpy.solve()
numpy.matmul()
numpy.matmul() 函数返回两个数组的矩阵乘积:
- 如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。
- 如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,矩阵相乘之后会将为1的维数去掉。
matmul 与dot 的差异主要在两个方面:
- 不允许乘标量,只能用
* 代替 matmul 操作的矩阵允许将最后两个索引的矩阵的栈广播
对于二维数组
它就是矩阵乘法:
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[1,2],[3,4]])
ans=np.matmul(a,b)
print(ans)
[[ 7 10]
[15 22]]
计算公式:
1
×
1
+
2
×
3
1\times 1 + 2\times 3
1×1+2×3,
1
×
2
+
2
×
4
1\times 2 + 2\times 4
1×2+2×4
3
×
1
+
4
×
3
3\times 1 + 4\times 3
3×1+4×3,
3
×
2
+
4
×
4
3\times 2 + 4\times 4
3×2+4×4
二维和一维运算
a = [[1,2],[3,4]]
b = [1,2]
print (np.matmul(a,b))
print (np.matmul(b,a))
[ 5 11]
[ 7 10]
维度大于二的数组
如果某一个参数是
n
(
n
>
2
)
)
n(n>2))
n(n>2))维的,该参数
n
n
n被看作一些矩阵(参数的最后两个维数为矩阵维数)的stack,而且计算时会相应的广播。
a = np.arange(2*3*4).reshape((2,3,4))
b = np.arange(2*4*3).reshape((2,4,3))
c = np.arange(1*3*4).reshape((1,4,3))
print("矩阵a:",'\n',a)
print("矩阵b:",'\n',b)
print("矩阵c:",'\n',c)
矩阵a:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
矩阵b:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]
矩阵c:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]]
a 多维数组,被当作两个
3
×
4
3\times 4
3×4矩阵。b 多维数组,被当作两个
4
×
3
4\times 3
4×3矩阵。c 多维数组,被当作一个
4
×
3
4\times 3
4×3矩阵
np.matmul(a,b) 会将a 的第一个矩阵和b 的第一个矩阵相乘,将a 的第二个矩阵b 的第二个矩阵相乘,最终得到一个
2
×
3
×
3
2\times 3\times 3
2×3×3的矩阵。
ans=np.matmul(a,b)
print(ans)
[[[ 42 48 54]
[ 114 136 158]
[ 186 224 262]]
[[ 906 960 1014]
[1170 1240 1310]
[1434 1520 1606]]]
np.matmul(a,c) 中c 只有一个矩阵,所以它会广播一个矩阵(即复制一个原本c 矩阵后两维的矩阵),这样c 就变成了
2
×
4
×
3
2\times 4\times 3
2×4×3的矩阵,可以与a 相乘得到一个
2
×
3
×
3
2\times 3\times 3
2×3×3的矩阵。
ans=np.matmul(a,c)
print(ans)
[[[ 42 48 54]
[114 136 158]
[186 224 262]]
[[258 312 366]
[330 400 470]
[402 488 574]]]
乘一个标量是不被允许的,只能用* 代替。
a=np.array([1,2])
print(np.matmul(a, 3))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-23-9a91f367630a> in <module>
1 a=np.array([1,2])
----> 2 print(np.matmul(a, 3))
ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
print(a*3)
[3 6]
|