Python中的几种乘法

在numpy的官方教程中,dot()是比较复杂的一个,因为参数的不同可以实现等同于np.matmul() 或者 np.multiply()的作用

numpy.dot(a,b,out=None)

两个array之间的点乘。具体来说:

① 如果a和b都是一维的,那么结果就是普通的內积(inner product)。可以使用np.matmul 或者 a @ b 得到相同的答案。

# 1-D array

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

b = np.array([4, 5, 6])

result_ab = np.dot(a, b)

result_ba = np.dot(b, a)

print('result_ab: %s' %(result_ab))

print('result_ba: %s' %(result_ba))

结果如下(a,b参数的顺序不会影响结果,对应位置相乘):

result_ab: 32

result_ba: 32

image.png

② 如果a和b都是二维的,运算等同于矩阵乘法(Dot product)。可以使用np.matmul 或者 a @ b 得到相同的答案。

# 2-D array: 2 x 3

a = np.array([[1, 2, 3], [4, 5, 6]])

# 2-D array: 3 x 2

b = np.array([[1, 2], [3, 4], [5, 6]])

result_ab = np.dot(a, b)

result_ba = np.dot(b, a)

print('dot_result_ab:\n %s' %(result_ab))

print('dot_result_ba:\n %s' %(result_ba))

result_ab = np.matmul(a, b)

result_ba = np.matmul(b, a)

print('matmul_result_ab:\n %s' %(result_ab))

print('matmul_result_ba:\n %s' %(result_ba))

结果如下:

dot_result_ab:

[[22 28]

[49 64]]

dot_result_ba:

[[ 9 12 15]

[19 26 33]

[29 40 51]]

matmul_result_ab:

[[22 28]

[49 64]]

matmul_result_ba:

[[ 9 12 15]

[19 26 33]

[29 40 51]]

(1) 矩阵乘法,位置会改变答案。

(2) 使用matmul()结果相同

image.png

③ 如果 a 或者 b 中有一个是标量的,效果等价于np.multiply ,可以使用 multiply(a,b) 或者 a * b 也可以。

# 2-D array: 2 x 3

a = np.array([[1, 2, 3], [4, 5, 6]])

# 标量

b = 3

result_ab = np.dot(a,b)

print('result_ab:\n %s' %(result_ab))

multiply_result_ab = np.multiply(a,b)

print('multiply_result_ab:\n %s' %(multiply_result_ab))

答案如下:

result_ab:

[[ 3 6 9]

[12 15 18]]

multiply_result_ab:

[[ 3 6 9]

[12 15 18]]

(1)参数位置不会改变答案

(2)使用multiply或者 * 也可以

④ 如果a是 N-D 数组, b 是 1-D的数组,答案是,a和b最后一个轴的乘积。好像比较难以理解,看demo。

# 2-D array: 2 x 3

a = np.array([[1, 2, 3], [4, 5, 6]])

b = np.array([1,2,3])

result_ab = np.dot(a,b)

print('result_ab:\n %s' %(result_ab))

结果如下:

result_ab:

[14 32]

如果a的维度(3,3,3), b的维度 (3,) 【注意(3,)和(3,0)是不同的】,那么答案是(3,3)的维度

⑤ 如果a是N-D数组, b 是 M-D数组(M>2),答案为a的最后一个轴与a的倒数第二个轴的和。

这个可能实际使用的时候不多。

numpy的官方demo。

>>> a = np.arange(3*4*5*6).reshape((3,4,5,6))

>>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3))

>>> np.dot(a, b)[2,3,2,1,2,2]

499128

>>> sum(a[2,3,2,:] * b[1,2,:,2])

499128

可以看dot的第二小点。

下面展示一下官方的函数:

image.png

image.png

可以看dot的第三小点。

image.png

image.png

四、还有需要注意的

对于array对象,*和np.multiply函数代表的是数量积,如果希望使用矩阵的乘法规则,则应该调用np.dot和np.matmul函数。

对于matrix对象,*直接代表了原生的矩阵乘法,而如果特殊情况下需要使用数量积,则应该使用np.multiply函数。

image.png

比较上图和下图的不同

image.png

python的matmul_numpy中dot()、outer()、multiply()以及matmul()的区别相关推荐

  1. python定义类()中写object和不写的区别

    python定义类()中写object和不写的区别 这里需要说明一下: python3中,类定义默认继承object,所以写不写没有区别 但在python2中,并不是这样 所以此内容是针对python ...

  2. python random randint_python中random.randint和random.randrange的区别详解

    在python中,通过导入random库,就能使用randint 和 randrange 这两个方法来产生随机整数.那这两个方法的区别在于什么地方呢?让我们一起来看看! 区别: randint 产生的 ...

  3. TensorFlow中multiply和matmul的区别

    TensorFlow中multiply是两个矩阵之间对应元素相乘,可以是矩阵*矩阵,也可以是矩阵*向量或是矩阵*一个数: 而matmul则是矩阵相乘,是矩阵行*矩阵列,即a x b.如下所示: 这个是 ...

  4. python re search match_简诉Python Re模块中re.search和re.match的区别

    先前的两篇文章<python re.match函数是什么,了解python match函数的使用>,<Python中的python re.search方法详解>,我们介绍了Py ...

  5. python的类中 _、__和__xx__的区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. Python中 ...

  6. python time包中的time.time()和time.clock()区别和使用

    在统计python代码 执行速度时要使用到time包,在查找相关函数时有time.time()和time.clock()两个函数可供选择.而两者是有区别的: cpu 的运行机制:cpu是多任务的,例如 ...

  7. Python笔记-Collection中Iterable、Iterator和Generator的区别

    Iterable Iterable是Python集合的一种,导入方式为from collections import Iterable.Iterable对象都具有__iter__()方法,可以被for ...

  8. python matplotlib.pyplot中add_subplot subplot函数的用法与区别(其实没什么区别)

    引用文章 https://blog.csdn.net/you_are_my_dream/article/details/53439518

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

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

最新文章

  1. shell脚本俄罗斯方块游戏
  2. 网站截图环境 php,Linux环境下php实现给网站截图的方法
  3. deepin/Ubuntu安装最新版docker-ce命令整理
  4. 和哪个专业的男生谈恋爱最惨?
  5. 关于Javascript闭包的理解(二)
  6. CentOS搭建SVN记录
  7. [转摘] 我的同学聚会--性格决定命运
  8. 图论及其应用:第二次作业
  9. RS485接口上的PTC
  10. office创建数据透视表
  11. 5G牌照发放了,但需要购买5G手机的用户应等明年再购买
  12. Java中常见常用的类
  13. 算法教给我的人生道理-贪婪算法
  14. 计算机怎么给硬盘加密,电脑上的硬盘如何加密?几种文件加密的方法
  15. 加拿大程序员趣闻系列 1_N,kotlin循环
  16. 泛泰长短信修改教程(供其他泛泰机型参考)
  17. Revit中添加水平仰视平面图及水平剖面
  18. 阿拉伯数字对应人民币大写表
  19. 第二节 构成人体必需的营养素
  20. day199-2019-01-05-英语流利阅读-待学习

热门文章

  1. 情绪管理训练—有效管理情绪的方法
  2. python 引用计数 循环引用_引用计数无法解决循环引用,CPython为何还使用它?
  3. 实现升序降序排列问题
  4. js解析json字符串、对象与json之间的转换
  5. webconfig machineKey
  6. note-linux:无法远程连接到服务器
  7. 石墨烯新用途被发现,可用于检测神经类疾病
  8. 鸿蒙手机下载安装,鸿蒙系统手机安装包
  9. Python 异步编程之——协程
  10. Hive使用简单总结