Numpy中dot ,* , multiply() ,matmul() 的区别 (待修改)

Numpy 中 * 用法

  • 在numpy.array数组类型中(不能为list),是将两个数组中元素一一对应相乘,即点乘。

  • 在numpy.mat矩阵类型中,是叉乘,即矩阵相乘。

a = np.array([[3, 3, 3],[4, 4, 4]])
b = np.array([[5],[5]])
c = np.array([[5,5]])
d = np.mat([[3, 3, 3],[4, 4, 4]])
print(a*b)
print(c*d)

结果:

[[15 15 15]
 [20 20 20]]
[[35 35 35]]

numpy.dot()

当dot()作用在数组类型或list类型时,两个一维数组时,结果为内积;其他为矩阵乘(即矢量积,叉乘)。

官方文档
我翻译一下

  • 如果a,b是两个实数,就是普通相乘。
  • 如果a,b两个都是一维数组,结果就是向量的内积。
  • 如果a,b都是二维数组,就变成矩阵相乘运算,推荐使用matmul@代替。
  • …等等
 a = np.array([1,1,1])
 b = np.array([2,2,2])
 c = np.array([[3,3,3],[4,4,4]])
 d = np.array([[5],[5],[5]])
 print(np.dot(a,b))
 print(np.dot(c,d))

结果:

6
[[35 35 35]]

当dot()作用在矩阵类型时(无论矩阵规模),两个矩阵要满足矩阵乘的行列要求,结果为矩阵乘(即矢量积,叉乘)

e = np.mat([[3,3,3],[4,4,4]])
f = np.mat([[5],[5],[5]])
print(np.dot(e,f))

结果:

matrix([[45],
       [60]])

numpy.multiply()

无论传入的参数类型是数组、矩阵、list,结果都为它们的数量积,点乘(即矩阵对应元素相乘)。 注意:当维数不同时,具有有广播现象

a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.array([[3,3,3],[4,4,4]])
print(np.multiply(a,b))
print(np.multiply(b,c))

结果:

array([2, 2, 2])
array([[6, 6, 6],
      [8, 8, 8]])

numpy.matmul

numpy.matmul本质上是返回两个矩阵的矩阵乘积。
即如果两个都是二维数组,或矩阵,结果就是直接的矩阵积。


import numpy.matlib 
import numpy as np 
 
a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print (np.matmul(a,b))

[[4  1] 
 [2  2]]

果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈(即把最后两维当成单个矩阵,前面当成它的索引),并进行相应广播。

import numpy.matlib 
import numpy as np 
 
a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print (np.matmul(a,b))

[[[ 2  3]
  [ 6 11]]

 [[10 19]
  [14 27]]]

关于这里广播操作,举个例子, 如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

import numpy.matlib 
import numpy as np 
 
a = [[1,0],[0,1]] 
b = [1,2] 
print (np.matmul(a,b))
print (np.matmul(b,a))


[1  2] 
[1  2]
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值