Numpy乘法解惑

numpy中数据格式有arraymat,乘法有普通乘号xdot,对于初学者(本人也是初学者)来说太容易迷糊了。下面记录一点心得。

先说结论:dot是遵循矩阵乘法的法则;普通乘号x遵循的法则既有矩阵乘法法则,也有逐元素相乘的法则,具体看相乘的两个数组的数据类型。


普通乘号X

1.array相乘
当两个array格式的数组相乘时,结果实际上是逐元素相乘。

In [60]: a = np.array([1, 2, 3, 4])

In [61]: b = np.array([2, 2, 3, 3])

In [62]: a * b
Out[62]: array([ 2,  4,  9, 12])

-----------------------------
In [63]: b = np.array([2])

In [64]: a * b
Out[64]: array([2, 4, 6, 8])
-----------------------------------
In [70]: b = np.array([2, 3])

In [71]: b
Out[71]: array([2, 3])

In [72]: a
Out[72]: 
array([[1, 2],
       [3, 4]])

In [73]: a * b # 此时相当于将b扩展成array([[2, 3],[2, 3]])
Out[73]: 
array([[ 2,  6],
       [ 6, 12]])
--------------------------------
In [74]: b.shape = (2, 1)

In [75]: b
Out[75]: 
array([[2],
       [3]])

In [76]: b * a # 此时相当于将b扩展成array([[2, 2], [3, 3]])
Out[76]: 
array([[ 2,  4],
       [ 9, 12]])

In [77]: a * b
Out[77]: 
array([[ 2,  4],
       [ 9, 12]])

2.mat相乘
当两个mat格式的数组相乘时,结果遵循矩阵相乘法则。

3.array与mat相乘
arraymat格式的数组相乘时,结果遵循矩阵相乘法则。

In [83]: a
Out[83]: 
array([[1, 2],
       [3, 4]])

In [84]: b = np.mat('[2 2];[3 3]')

In [85]: b
Out[85]: 
matrix([[2, 2],
        [3, 3]])

In [86]: a * b # 注意a * b的结果与b * a的结果不一致
Out[86]: 
matrix([[ 8,  8],
        [18, 18]])

In [87]: b * a
Out[87]: 
matrix([[ 8, 12],
        [12, 18]])

---------------------------------
In [90]: a
Out[90]: 
matrix([[1, 2],
        [3, 4]])

In [91]: b = np.array([2, 3])

In [92]: b
Out[92]: array([2, 3])

In [93]: a * b # 注意此时出错了,因为不符合矩阵相乘法则
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-93-50927f39610b> in <module>()
----> 1 a * b

/usr/local/lib/python3.6/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
    341         if isinstance(other, (N.ndarray, list, tuple)) :
    342             # This promotes 1-D vectors to row vectors
--> 343             return N.dot(self, asmatrix(other))
    344         if isscalar(other) or not hasattr(other, '__rmul__') :
    345             return N.dot(self, other)

ValueError: shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)

In [94]: b * a
Out[94]: matrix([[11, 16]])

dot

dot实际上采用的就是矩阵的乘法规则,不管是什么数据格式。如下示例:
1.array相乘

In [2]: a = np.array([[1, 2], [3, 4]])

In [3]: a
Out[3]: 
array([[1, 2],
       [3, 4]])

In [4]: b = np.array([[2, 3], [2, 3]])

In [5]: b
Out[5]: 
array([[2, 3],
       [2, 3]])

In [6]: a.dot(b) # 此时就是矩阵a x 矩阵b的结果
Out[6]: 
array([[ 6,  9],
       [14, 21]])

下面再举一个反常的例子:

In [7]: b = np.array([2, 3])

In [8]: a.dot(b)
Out[8]: array([ 8, 18])

如何理解这个例子呢?若按照矩阵的乘法法则,则a x b 应该会报错啊。实际上,此时的a.dot(b)可以理解为a x b.T的结果,再转置回来,如下所示:

In [9]: c = b.reshape((2, 1))

In [10]: c
Out[10]: 
array([[2],
       [3]])

In [11]: a.dot(c)
Out[11]: 
array([[ 8],
       [18]])

In [12]: np.mat(a) * c
Out[12]: 
matrix([[ 8],
        [18]])

2.其余mat相乘及mat与array相乘,都是遵循矩阵的乘法法则。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.NumPy的引入 标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列...
    wlj1107阅读 1,047评论 0 2
  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 2,602评论 1 13
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,252评论 0 5
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 3,926评论 1 10
  • 小时候的爱情 那么单纯 喜欢一个人喜欢就是喜欢 没有任何其他原因 尽管不帅但在你眼中确是最帅 每次下课后的几分钟相...
    黑白页阅读 307评论 0 0