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