numpy矩阵乘法中的multiply,matmul和dot的使用

 更新时间:2023年02月15日 09:52:29   作者:木盏  
本文主要介绍了numpy矩阵乘法中的multiply,matmul和dot的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

用numpy做矩阵运算时,少不了用到矩阵乘法。本文帮你迅速区分multiply, matmul和dot的区别。

numpy官方文档中的说明:(想深入了解可以一戳)

multiplyhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html

dothttps://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html

matmul:https://docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html

1. multiply(矩阵点乘)

先说说更简单的multiply,如果两个维度完全一样的矩阵用multiply做乘法,那么它们只是进行对应位置元素之间的乘法,得到一个同样维度的矩阵输出。这就是所谓的element-wise product。

import numpy as np
a = np.array([[0,1,2], [1,2,3], [3,4,5]])
b = np.array([[1,1,2], [2,2,1], [1,1,2]])
print(np.multiply(a, b))

输出:

array([[ 0, 1, 4], [ 2, 4, 3], [ 3, 4, 10]])

看这个栗子,应该十分好理解multiply。但是,如果你认为multiply只能对同样维度的矩阵之间相乘,那你就 t/o-o\ simple了。

如果3x3的矩阵和3x1的矩阵用multiply相乘会怎样呢?继续看栗子:

import numpy as np
a = np.array([[0, 1, 2], [1, 2, 3], [3, 4, 5]])
b = np.array([1, 2, 3])
print(np.multiply(a, b))

输出:

array([[ 0,  2,  6],
       [ 1,  4,  9],
       [ 3,  8, 15]])

相当于用b依次乘以a的每一行。记住,multiply是满足交换律的。(a和b互换位置结果不变)

对于3x3的矩阵a,可以用3x1的矩阵与它相乘,也可以用1x3的矩阵与它相乘。还可以用它乘以一个常数:

import numpy as np
a = np.array([[0, 1, 2], [1, 2, 3], [3, 4, 5]])
print(np.multiply(a, 3))

相当于a中各个元素乘以3。

2. dot(矩阵叉乘)

dot就是矩阵叉乘,MxN矩阵乘以NxC矩阵会得到一个MxC的矩阵。对于2D情况下的dot,等同于matmul,也等同于运算符@。

用一张图很好解释:

>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
       [2, 2]])
>>> a@b
array([[4, 1],
       [2, 2]])

3. matmul

matmul不支持标量乘法,在2D矩阵乘法中,其效果与dot一样。

在N维矩阵乘法中(N>=3),体现出与dot不一样的算法。

>>> a = np.ones([9, 5, 7, 4])
>>> c = np.ones([9, 5, 4, 3])
>>> np.dot(a, c).shape
(9, 5, 7, 9, 5, 3)
>>> np.matmul(a, c).shape
(9, 5, 7, 3)
>>> # n is 7, k is 4, m is 3

总结

1. dot和multiply对于标量相乘,效果一样,而matmul不支持标量相乘:

>>>dot(3,3)
>>>9
>>>multiply(3,3)
>>>9
>>>matmul(3,3)
error!

2. 对于2D矩阵相乘,dot和matmul效果一样, 并且这俩都不满足交换律。通常建议优先使用matmul:

from numpy import *
a = arange(9).reshape(3,3)
b = arange(3).reshape(1,3)
 
print(dot(b,a))
print(matmul(b,a))

输出:

[[15 18 21]]
[[15 18 21]]

到此这篇关于numpy矩阵乘法中的multiply,matmul和dot的使用的文章就介绍到这了,更多相关numpy矩阵乘法中的multiply,matmul和dot内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python随机生成大小写字母数字混合密码(仅20行代码)

    python随机生成大小写字母数字混合密码(仅20行代码)

    这篇文章主要介绍了python随机生成大小写字母数字混合密码,主要是利用random模块随机生成数字,大小写字母,通过循环次数来实现此功能,需要的朋友可以参考下
    2020-02-02
  • python requests使用socks5的例子

    python requests使用socks5的例子

    今天小编就为大家分享一篇python requests使用socks5的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python进阶教程之循环对象

    python进阶教程之循环对象

    这篇文章主要介绍了python进阶教程之循环对象,循环对象是这样一个对象,它包含有一个next()方法,这个方法的目的是进行到下一个结果,需要的朋友可以参考下
    2014-08-08
  • Python使用pyglet库完整实现汉诺塔游戏流程详解

    Python使用pyglet库完整实现汉诺塔游戏流程详解

    这篇文章主要介绍了Python使用pyglet库完整实现汉诺塔游戏流程,汉诺塔问题是一个递归问题,也可以使用非递归法来解决,这个问题不仅是一个数学和逻辑问题,也是一个很好的教学工具,可以用来教授递归、算法和逻辑思考等概念,需要的朋友可以参考下
    2007-02-02
  • python多线程用法实例详解

    python多线程用法实例详解

    这篇文章主要介绍了python多线程用法,以实例形式较为详细的分析了线程同步、队列等概念及用法技巧,需要的朋友可以参考下
    2015-01-01
  • python实现有效的括号判断实例代码

    python实现有效的括号判断实例代码

    这篇文章主要给大家介绍了关于python实现有效的括号判断的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Python判断变量是否是None写法代码实例

    Python判断变量是否是None写法代码实例

    这篇文章主要介绍了Python判断变量是否是None写法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 学习python的前途 python挣钱

    学习python的前途 python挣钱

    在本文里我们给大家整理了关于学习python的前途以及python挣钱的方法整理,有兴趣的朋友们阅读下。
    2019-02-02
  • Python 的 Socket 编程

    Python 的 Socket 编程

    这篇文章最初发布的时候标题是“Python的WebSocket编程”,坦白来说有点文不对题。我们在这里打算讨论的仅仅是常规的socket编程。尽管 Web Socket 和常规sockets有点很相似,但又不是同一个东西。那我还是希望这篇文章对你们有点帮助。
    2015-03-03
  • Python常见排序操作示例【字典、列表、指定元素等】

    Python常见排序操作示例【字典、列表、指定元素等】

    这篇文章主要介绍了Python常见排序操作,结合实例形式总结分析了Python针对字典、列表及指定元素等常见排序操作实现技巧,需要的朋友可以参考下
    2018-08-08

最新评论