Python Broadcast机制

最近在用numpy的时候,里面的矩阵和向量之间各种乘法加法搞的我头昏脑胀,整理下总结出来的规则

首先说明array型数据结构有两种类型,一种是一维的向量,比如用np.linspace(1,2,num=2)创建出的对象,shape为(2,);另外一种就是多维的矩阵,如np.zeros(1,2)创建出的对象,其shape为(1,2),这两种类型是不一样的。

一、矩阵之间的矩阵乘法

不必多说,就是按照正常的矩阵乘法规则来做
(N,M) (M,P) = (N,P)

二、矩阵之间按元素相乘、相加

这里开始就涉及到广播(broadcast)的问题了。
其实也比较简单,两个矩阵broadcast后的结果每一维都是两个矩阵中最大的。

但broadcast必须满足两个规则,即要么相对应的维数相等,要么其中有一个矩阵的维数是1
那么问题来了,哪两个维度是相对应的维数呢?规则就是将矩阵的shape写出来,然后按右对齐逐维对比。

通过以上方法,可以得出两矩阵broadcast结果的维数,而最后结果的计算方法就是先将两个矩阵都broadcast到结果的维数,然后再按照相同维度的矩阵对应元素相乘、相加。例子如下

A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5
Result (4d array):  8 x 7 x 6 x 5

A      (2d array):  5 x 4
B      (1d array):      1
Result (2d array):  5 x 4

A      (2d array):  15 x 3 x 5
B      (1d array):  15 x 1 x 5
Result (2d array):  15 x 3 x 5

三、矩阵和向量之间的矩阵乘法

这里也很简单,规则是
作左乘数的向量是行向量,作右乘数的向量是列向量。
这样做的好处就是,结果矩阵一定也是个向量。这个规则也说明了向量不一定是行向量(虽然print出来看见的是一个行向量)

四、矩阵和向量之间的按元素乘法、加法

规则其实和“二”中说的是一样的,只不过这里要注意的是,向量在这里永远当作(1,N)来看,也就是是行向量,按照“二”中所说的broadcast的规则,向量的维度永远从右对齐,也就是只有最右边有数,也就说明和他进行broadcast的矩阵,其最低维(也就是最右侧的维度)要么是一维,要么就和向量的维度相同。举例子如下

矩阵 (3d array)   : 256 x 256 x 3
向量 (1d array)   :             3
结果 (3d array)   : 256 x 256 x 3

猜你喜欢

转载自blog.csdn.net/qq_38255689/article/details/79779842