N u m P y NumPy N u m P y提供了线性代数函数库 linalg
,该库包含了线性代数所需的所有功能,可以看看下面的说明。
函数内容
两数组的点积
两向量的点积
两数组的内积
数组的行列式
两数组的矩阵积
求矩阵的逆
求解线性矩阵方程
相关函数介绍
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: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
</module></ipython-input-23-9a91f367630a>
print(a*3)
[3 6]
Original: https://blog.csdn.net/Phoenix_ZengHao/article/details/123601243
Author: Phoenix_ZengHao
Title: Numpy线性代数-numpy.matmul()
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/761415/
转载文章受原作者版权保护。转载请注明原作者出处!