Numpy线性代数-numpy.matmul()

N u m P y NumPy N u m P y提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明。

函数内容

两数组的点积

两向量的点积

两数组的内积

数组的行列式

两数组的矩阵积

求矩阵的逆

求解线性矩阵方程

相关函数介绍

numpy.matmul()

numpy.matmul()函数返回两个数组的矩阵乘积:

  • 如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。
  • 如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,矩阵相乘之后会将为1的维数去掉。

matmuldot的差异主要在两个方面:

  • 不允许乘标量,只能用 *代替
  • 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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球