【Numpy乘法详解(代码示例)】np.multiply()、np.matmul()、np.dot()等

文章目录

  • 【Numpy乘法详解(代码示例)】np.multiply()、np.matmul()、np.dot()等
    • 1. 介绍
    • 2. 代码示例
      • 2.1 一维数组(np.array__1D)
      • 2.2 二维(多维)数组(np.array__xD)
        • 2.2.1 满足矩阵乘法,但尺寸不同
        • 2.2.2 满足矩阵乘法,且尺寸相同
        • 2.2.3 不满足矩阵乘法,但尺寸相同
      • 2.3 矩阵(np.matrix)
        • 2.3.1 矩阵尺寸不同,但符合矩阵乘法
        • 2.3.2 矩阵尺寸相同
      • 2.4 np.matmul()__vs__np.dot()
    • 3. 参考

1. 介绍

  1. 星号(*):array对应元素相乘,不满足广播的条件则出错、矩阵乘法。
  2. np.multiply():array(matrix)对应元素相乘,不满足广播的条件则出错。
  3. np.matmul():向量点积、矩阵乘法。
  4. 艾特(@):向量点积、矩阵乘法。注意:在numpy中可以使用@来替代np.matmul,下面不做赘述。
  5. np.dot():向量点积、矩阵乘法。

2. 代码示例

2.1 一维数组(np.array__1D)

In [2]: a=np.array([1,2])
In [3]: b=np.array([3,4])In [4]: a*b
Out[4]: array([3, 8])In [5]: np.multiply(a,b)
Out[5]: array([3, 8])In [6]: np.matmul(a,b)
Out[6]: 11In [7]: np.dot(a,b)
Out[7]: 11In [8]: a@b
Out[8]: 11

2.2 二维(多维)数组(np.array__xD)

多维数组对于np.dot和np.matual会有一些不同,下面2.4中会举例说明。

2.2.1 满足矩阵乘法,但尺寸不同

In [18]: a = np.array([[0, 1],[2, 3],[4, 5]]) # (3, 2)
In [19]: b = np.array([[0],[1]]) # (2, 1)In [21]: a*b
---------------------------------------------------------------------------
ValueError: operands could not be broadcast together with shapes (3,2) (2,1)In [22]: np.multiply(a,b)
---------------------------------------------------------------------------
ValueError: operands could not be broadcast together with shapes (3,2) (2,1)In [23]: np.matmul(a,b)
Out[23]:
array([[1],[3],[5]])In [24]: np.dot(a,b)
Out[24]:
array([[1],[3],[5]])

2.2.2 满足矩阵乘法,且尺寸相同

In [29]: a=np.array([[1,2],[3,4]])  # (2, 2)
In [30]: b=np.array([[0,1],[2,3]]) # (2, 2)In [33]: a*b
Out[33]:
array([[ 0,  2],[ 6, 12]])In [34]: np.multiply(a,b)
Out[34]:
array([[ 0,  2],[ 6, 12]])In [35]: np.matmul(a,b)
Out[35]:
array([[ 4,  7],[ 8, 15]])In [36]: np.dot(a,b)
Out[36]:
array([[ 4,  7],[ 8, 15]])

2.2.3 不满足矩阵乘法,但尺寸相同

>>> a = np.array([[0, 1],[2, 3],[4, 5]])   #(3, 2)
>>> b = np.array([[0, 1],[2, 3],[4, 5]])  #(3, 2)>>> a*b
array([[ 0,  1],[ 4,  9],[16, 25]])>>> np.multiply(a,b)
array([[ 0,  1],[ 4,  9],[16, 25]])>>> np.matmul(a,b)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 2)>>> np.dot(a, b)
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<__array_function__ internals>", line 6, in dot
ValueError: shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)

2.3 矩阵(np.matrix)

2.3.1 矩阵尺寸不同,但符合矩阵乘法

In [48]: a = np.matrix([[0, 1],[2, 3],[4, 5]])  #(3, 2)
In [49]: b=np.matrix([[0],[1]])            #(2, 1)
# 出现不同!!!!
In [50]: a*b
Out[50]:
matrix([[1],[3],[5]])In [51]: np.multiply(a,b)
---------------------------------------------------------------------------
ValueError: operands could not be broadcast together with shapes (3,2) (2,1)In [52]: np.matmul(a,b)
Out[52]:
matrix([[1],[3],[5]])In [53]: np.dot(a,b)
Out[53]:
matrix([[1],[3],[5]])

2.3.2 矩阵尺寸相同

In [56]: a=np.matrix([[1,2],[3,4]])In [57]: b=np.matrix([[0,1],[2,3]])In [60]: a*b # 矩阵乘法
Out[60]:
matrix([[ 4,  7],[ 8, 15]])In [61]: np.multiply(a,b)    # 点积
Out[61]:
matrix([[ 0,  2],[ 6, 12]])In [62]: np.matmul(a,b)
Out[62]:
matrix([[ 4,  7],[ 8, 15]])In [63]: np.dot(a,b)
Out[63]:
matrix([[ 4,  7],[ 8, 15]])

2.4 np.matmul()__vs__np.dot()

上面五种情况np.matmul()和. np.dot()的结果都是相同的,我们来看看它们之间的差别。

差别在于2维以上np.array数组
np.multiply()和*依然是array对应元素相乘,不满足广播的条件则出错。接下来主要分析np.matmul()和np.dot()。

In [97]: a = np.array([[[ 0,  1,  2],[ 3,  4,  5]],[[ 6,  7,  8],[ 9, 10, 11]]])    # (2, 2, 3)In [98]: b = np.array([[[0, 1],[2, 3],[4, 5]]])         # (1, 3, 2)In [99]: np.dot(a,b)
Out[99]:
array([[[[10, 13]],[[28, 40]]],[[[46, 67]],[[64, 94]]]])In [100]: np.dot(a,b).shape
Out[100]: (2, 2, 1, 2)In [101]: np.matmul(a,b)
Out[101]:
array([[[10, 13],[28, 40]],[[46, 67],[64, 94]]])In [102]: np.matmul(a,b).shape
Out[102]: (2, 2, 2)     # 比dot少了一维!!!!!

In [105]: a = np.array([[[ 0,  1,  2],[ 3,  4,  5]],[[ 6,  7,  8],[ 9, 10, 11]]])   # (2, 2, 3)In [106]: b = np.array([[[ 0,  1],[ 2,  3],[ 4,  5]],[[ 6,  7],[ 8,  9],[10, 11]]])     # (2, 3, 2)In [107]: np.dot(a,b)
Out[107]:
array([[[[ 10,  13],[ 28,  31]],[[ 28,  40],[100, 112]]],[[[ 46,  67],[172, 193]],[[ 64,  94],[244, 274]]]])In [118]: np.dot(a,b).shape
Out[118]: (2, 2, 2, 2)In [109]: np.matmul(a,b)
Out[109]:
array([[[ 10,  13],[ 28,  40]],[[172, 193],[244, 274]]])In [110]: np.matmul(a,b).shape
Out[110]: (2, 2, 2)     # 比dot少了一维!!!!!

获得结论:

  • np.matmul() 分别把数组的最后两个维度(组成矩阵)视为一个元素,并对其进行广播。
     
    如上文中b.shape:[1,3,2],广播为[2,3,2]再与a相乘。广播后两个数组matmul 即两个数组对应位置的矩阵相乘。在上面的例子中,最终结果分别由两对2 × 3 和 3 × 2 的矩阵乘法得到两个2 × 2矩阵,即2 × 2 × 2。

  • np.dot() 则对第一个数组的最后一个维度(行向量)以及第二个数组的倒数第二个维度(列向量)进行点积。
     
    在上面的例子中,a可以看作2 × 2个行向量。b可以看作2 × 2个列向量。np.dot会将a的每一个行向量与b的全部列向量进行点积,每一个行向量都能得到一个二维数组,占据结果的后两维。属于同一个二维数组的行向量,得到的结果又合并为一个三维数组。这个三维数组又与其他二维数组的行向量得到的三维数组合并成四维数组。

注意:np.matmul() 和np.dot() 还有一个区别是:np.matmul() 无法用于标量与array相乘。

In [113]: a=np.array([1,2,3])In [114]: np.dot(a, 2)
Out[114]: array([2, 4, 6])In [115]: np.matmul(a,2)
ValueError: Scalar operands are not allowed, use '*' instead

3. 参考

【1】https://www.delftstack.com/howto/numpy/numpy-dot-vs-matmul/
【2】https://blog.csdn.net/weixin_44378835/article/details/117028708

【Numpy乘法详解】np.multiply()、np.matmul()、np.dot()等相关推荐

  1. Numpy.array()详解 、np.array与np.asarray辨析、 np.array和np.ndarry的区别

    记录一下numpy.array()的详细用法,以及与np.asarray()和np.ndarray()的区别. 目录 1. Numpy.array()详解 1.1 函数形式 1.2 参数详解 1.3 ...

  2. Numpy.array()详解

    1. Numpy.array()详解 该函数的作用一言蔽之就是用来产生数组. 1.1 函数形式 numpy.array(object, dtype=None, copy=True, order='K' ...

  3. numpy矩阵乘法中的multiply,matmul和dot

    用numpy做矩阵运算时,少不了用到矩阵乘法.本文帮你迅速区分multiply, matmul和dot的区别. numpy官方文档中的说明:(想深入了解可以一戳) multiply: https:// ...

  4. 玩数据必备Python库:Numpy使用详解

    导读:Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,其提供了矩阵运算的功能.本文带你了解Numpy的一些核心知识点. 作者:魏溪含 涂铭 张修鹏 如需转载请联 ...

  5. numpy.sum详解

    numpy.sum 用例: numpy.sum(a, axis=None, dtype=None, out=None, keepdims=) 功能: 数组沿着指定的轴求和. 参数 变量名 数据类型 功 ...

  6. numpy.argsort详解

    numpy.argsort 用例: numpy.argsort(a, axis=-1, kind=None, order=None) 功能: 返回数组排序后的元素索引值. 根据kind指定的算法对数组 ...

  7. numpy.newaxis详解

    numpy.newaxis numpy.newaxis的工作方式及适用场合 简单地说,newaxis的作用是给现有的数组增加一个维度.例如: 1维数组将变为2维数组 2维数组将变为3维数组 3维数组将 ...

  8. numpy.absolute详解

    numpy.absolute 用例: numpy.absolute(x, /, out=None, *, where=True, casting='same_kind', order='K', dty ...

  9. numpy.concatenate详解

    numpy.concatenate 用例: numpy.concatenate((a1, a2, -), axis=0, out=None) 功能: 沿着指定的轴拼接一系列数组. 参数 变量名 数据类 ...

最新文章

  1. java 文件md5校验_Java 获取 文件md5校验码
  2. linux mysql运维_Linux运维常用的 MySQL基础命令
  3. C语言再学习 -- 关键字typedef
  4. 牛客网【每日一题】5月18日 「土」秘法地震
  5. 飞畅科技告诉你什么是集成串口服务器POE交换机?
  6. java - 菲波拉契数列 兔子个数
  7. 人脸识别中的阈值应该如何设置?
  8. mysql之 mysql_config_editor/login-path 登录密码保护
  9. Web前端 03 Html5(收官)
  10. MVX Android设计架构浅析-MVP
  11. EXCEL表格-输入身份证号无法正常展示问题详解
  12. lol java_浅谈设计模式(java)——从lol来看观察者模式
  13. The DELETE statement conflicted with the REFERENCE constraint
  14. linux漏洞分析,Spring-data-commons(CVE-2018-1273)漏洞分析
  15. AcWing 273. 分级 (推论,DP)
  16. Go设计模式--访客模式
  17. 最快最有效的锻炼出腹肌来
  18. x264 代码重点详解 详细分析
  19. 老嘤学习笔记——python函数
  20. 多旋翼飞行器设计与控制(一)—— 绪论

热门文章

  1. 「MySQL」- 复杂的SQL查询语句
  2. oracle 数据库 decode()用法 sign()用法 rownum用法 tjd面试真题
  3. 库克清华演讲:乔布斯弥留之际的一句话
  4. 戴尔笔记本如何查看HTML代码,戴尔笔记本win7系统如何查看电脑型号
  5. When Human Pose Estimation Meets Robustness: Adversarial Algorithms and Benchmarks阅读笔记
  6. Redis学习(1)-基本命令与持久化机制
  7. Gmail POP3设定
  8. 网站更换服务器会影响权重吗,网站更换了服务器导致权重下降怎么办
  9. 一键 html代码排序,SEO中常用HTML代码大全,及权重排序
  10. mysql 表空间修改_mysql8 参考手册--调整系统表空间