numpy中矩阵相关乘法总结

一、numpy中向量和矩阵的概念

向量:1维
矩阵:至少是2维

注意:numpy中对于向量的定义与数学中对向量的定义有些不同,数学中对向量的定义是竖向写法,但由于numpy中不能直接直接用竖向表示,因此在numpy中对向量都是通过np.array([1,2,3])的横向表示,其shape是(3,)仅有一维,而numpy中竖向表示的np.array([[1],[2],[3]])实际是shape为(3,1)的二维矩阵,因此在numpy中的向量仅仅指shape是一维的情况,也即在numpy中向量都是横向表示,而其他均是多维矩阵。

二、矩阵相乘有3种可能想要的到的结果

对位乘积:两个矩阵shape相同,各元素对应相乘,结果是一个相同shape的矩阵
矩阵乘法:数学上的矩阵乘法,结果是一个矩阵
向量内积:对应元素相乘,再相加,结果是一个数值

三、numpy中可用的乘法运算操作

1、a*b
2、numpy.dot(a,b)
3、numpy.multiply(a,b)
4、numpy.matmul(a,b)
5、a@b

四、5种操作如何与矩阵乘法的3种可能结果对应

1、dot(a,b)函数

(i)当a,b都是一维数组(矩阵),匹配向量内积,要求两个数组的元素位置一致
np.dot(np.array([100,100,100]),np.array([1,2,3]))
得到结果
600

(ii)当a,b是多维数组(矩阵)与一维数组(矩阵)的情况则要视多维与一维所在的前后位置的不同来匹配不同的运算
ii.1)当a,b是多位数组(矩阵)在前而一维数组(矩阵)在后多前一后)则匹配内积分配律,一维数组(矩阵)将依次与多维数组的每一行向量进行内积运算
np.dot(np.array([[10,10,10],[100,100,100]]),np.array([1,2,3]))
得到结果
array([60, 600])
注意:多维数组(矩阵)在前而一维数组(矩阵)在后时必须满足内积的元素对应要求,否则就会报错。

np.dot(np.array([[1],[2],[3]]),np.array([100,100,100]))就会报错
shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0)原因在于此时np.dot将匹配内积,但是np.array([[1],[2],[3]])的每一行向量[1][2][3]均是元素个数1无法对应np.array([100,100,100])的元素个数3进行内积。

纠正方式为
np.dot(np.array([[1,1,1],[2,2,2],[3,3,3]]),np.array([100,100,100]))将a纠正为元素个数3的

np.array([[ 1,1,1 ],
          [ 2,2,2 ],
          [ 3,3,3 ]])

与b的元素个数3一致,可进行内积分配率

np.dot( np.array([[ 1,1,1 ],      ,      np.array([ 100,100,100 ]) )
                  [ 2,2,2 ],
                  [ 3,3,3 ]])

得到np.array([ 300, 600 , 900])
ii.2)当a,b是一维数组(矩阵)在前而多维数组(矩阵)在后一前多后)则匹配矩阵乘法分配律
无论是np.dot(np.array([100,100,100]),np.array([[1],[2],[3]]))
得到结果
array([600])
注意:一维数组(矩阵)在前而多维数组(矩阵)在后时必须满足矩阵乘法的元素对应要求,否则就会报错
np.dot(np.array([1,2,3]),np.array([[10,10,10],[100,100,100]]))
就会报错

shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0)
原因在于此时np.dot将匹配矩阵乘法,但是np.array([1,2,3])的元素个数3无法对应np.array([[10,10,10],[100,100,100]]))的元素个数2进行矩阵乘法

纠正方式为np.dot(np.array([1,2,3]),np.array([[10,10],[100,100],[1000,1000]]))将b纠正为元素个数3的

np.array([[  10,   10],
          [ 100,  100],
          [1000, 1000]])

与a的元素个数3一致,可进行矩阵乘法分配率

np.dot( array([1,2,3])   ,   np.array([[  10,   10], )
                                       [ 100,  100],
                                       [1000, 1000]])

得到array([ 3210,3210 ])

(iii)当a,b都是多维矩阵,匹配矩阵乘法
np.dot(np.array([[10,10,10],[100,100,100]]),np.array([[1,2],[3,5],[6,7]])
得到结果
array([[100, 140], [1000, 1400]])
2、multiply(a,b)函数
a,b必须有相同的shape,对位乘积
3、a*b表达式
a,b必须有相同的shape,对位乘积
4、matmul(a,b)函数:
数学上的矩阵乘法
5、a@b表达式
数学上的矩阵乘法

五、 3种结果如何与5种运算对应

对位乘积: a*b 、multiply(a,b)
向量内积: dot(a,b) 当a,b均为一维向量
矩阵乘积: dot(a,b) 、matmul(a,b) 、a@b

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐