python numpy模块矩阵乘法以及广播类逐元素相乘

本文主要说明numpy模块中两种乘法使用的符号@和*,并未对广播原则进行详细介绍。

1.以示例说明矩阵乘法与广播类逐元素相乘的区别

示例矩阵和列向量
m = [ 1 2 3 4 5 6 7 8 9 ] , v = [ 10 20 30 ] m= \begin{bmatrix} 1\quad2\quad3 \\ 4\quad5\quad6 \\ 7\quad8\quad9 \\ \end{bmatrix}, v=\begin{bmatrix} 10 \\ 20 \\ 30 \end{bmatrix} m=123456789,v=102030
【1】矩阵乘法
m m m v v v相乘为
[ 1 ∗ 10 + 2 ∗ 20 + 3 ∗ 30 4 ∗ 10 + 5 ∗ 20 + 6 ∗ 30 7 ∗ 10 + 8 ∗ 20 + 9 ∗ 30 ] = [ 10 + 40 + 90 40 + 100 + 180 70 + 160 + 270 ] = [ 140 320 500 ] \begin{bmatrix} 1*10+2*20+3*30 \\ 4*10+5*20+6*30 \\ 7*10+8*20+9*30 \end{bmatrix} =\begin{bmatrix} 10+40+90 \\ 40+100+180 \\ 70+160+270 \end{bmatrix} =\begin{bmatrix} 140 \\ 320 \\ 500 \end{bmatrix} 110+220+330410+520+630710+820+930=10+40+9040+100+18070+160+270=140320500
【2】广播类逐元素相乘
m m m v v v相乘为
[ 1 ∗ 10 2 ∗ 10 3 ∗ 10 4 ∗ 20 5 ∗ 20 6 ∗ 20 7 ∗ 30 8 ∗ 30 9 ∗ 30 ] = [ 10 20 30 80 100 120 210 240 270 ] \begin{bmatrix} 1*10&2*10&3*10 \\ 4*20&5*20&6*20 \\ 7*30&8*30&9*30 \end{bmatrix}= \begin{bmatrix} 10&20&30 \\ 80&100&120\\ 210&240&270 \end{bmatrix} 110420730210520830310620930=10802102010024030120270

2.numpy模块调用流程
In [1]: import numpy as np
In [2]: m = np.array([[1,2,3],[4,5,6],[7,8,9]])
In [3]: v = np.array([[10],[20],[30]])

# 【1】矩阵乘法
In [4]: m @ v
Out[4]: array([[140],
       [320],
       [500]])

# 【2】广播类逐元素相乘
In [5]: m * v
Out[5]: array([[ 10,  20,  30],
       [ 80, 100, 120],
       [210, 240, 270]])      

【说明】

  1. numpy模块中矩阵乘法使用符合@
  2. 广播类逐元素相乘结果矩阵的shape与shape最大矩阵保持一致
    先将 v v v扩展为 [ 10 10 10 20 20 20 30 30 30 ] \begin{bmatrix}10&10&10\\20&20&20\\30&30&30\end{bmatrix} 102030102030102030,shape与 m m m保持一致,然后再与 m m m进行逐元素的相乘。详细可参照numpy模块广播的原则。
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页