python numpy中multiply与*及matul 的区别说明


Posted in Python onMay 26, 2021

1、对于矩阵(matrix)而言

multiply是对应元素相乘,而 * 、np.matmul() 函数 与 np.dot()函数 相当于矩阵乘法(矢量积),对应的列数和行数必须满足乘法规则;如果希望以数量积的方式进行,则必须使用 np.multiply 函数,如下所示:

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

结果是

[[ 1 4 9 16 25]]
a = np.mat([[1, 2, 3, 4, 5]])
b = np.mat([ [1],[2],[3],[4],[5] ] )
d=a*b
print(d) #a是shape(1,5),b是shape(5,1),结果是一个实数

结果是

[[55]]

2、对于数组(Array)而言

* 与 multiply均表示的是数量积(即对应元素的乘积相加),np.matmul与np.dot表示的是矢量积(即矩阵乘法)。

代码:

if __name__ == '__main__':
    w = np.array([[1,2],[3,4]])
    x = np.array([[1,3],[2,4]])
    w1 = np.array([[1,2],[3,4]])
    x1 = np.array([[1,2]])
    w_mat = np.mat([[1,2],[3,4]])
    x_mat = np.mat([[1,3],[2,4]])
    print("x1.shape:",np.shape(x1))
    w_x_start = w*x
    w_x_dot = np.dot(w,x)
    x_w_dot = np.dot(x,w)
    w_x_matmul = np.matmul(w, x)
    x_w_matmul = np.matmul(x, w)
    w_x_multiply = np.multiply(w,x)
    x_w_multiply = np.multiply(x, w)
    #w1_x1_matmul = np.matmul(w1, x1)
    x1_w1_matmul = np.matmul(x1, w1)
    w_x_mat_matmul = np.matmul(w_mat,x_mat)
    x_w_mat_matmul = np.matmul(x_mat, w_mat)
    w_x_mat_start = w_mat*x_mat
    x_w_mat_start = x_mat*w_mat
    w_x_mat_dot = np.dot(w_mat,x_mat)
    x_w_mat_dot = np.dot(x_mat,w_mat)
    w_x_mat_multiply = np.multiply(w_mat,x_mat)
    x_w_mat_multiply = np.multiply(x_mat,w_mat)
 
    print("W.shape:", np.shape(w))
    print("x.shape:", np.shape(x))
    print("w_x_start.shape:", np.shape(w_x_start))
    print("w_x_dot.shape:", np.shape(w_x_dot))
    print("x_w_dot.shape:", np.shape(x_w_dot))
    print("x1_w1_matmul.shape::", np.shape(x1_w1_matmul))
 
    print("做Array数组运算时:", '\n')
    print("w_x_start:", w_x_start)
    print("w_x_dot:", w_x_dot)
    print("x_w_dot:", x_w_dot)
    print("w_x_matmul:", w_x_matmul)
    print("x_w_matmul:", x_w_matmul)
    print("w_x_multiply:", w_x_multiply)
    print("x_w_multiply:", x_w_multiply)
    # print("w1_x1_matmul:", w1_x1_matmul)
    print("x1_w1_matmul:", x1_w1_matmul)
 
    print("做matrix矩阵运算时:", '\n')
    print("w_x_mat_start:", w_x_mat_start)
    print("x_w_mat_start:", x_w_mat_start)
    print("x_w_mat_dot:", x_w_mat_dot)
    print("w_x_mat_dot:", w_x_mat_dot)
    print("w_x_mat_matmul:",w_x_mat_matmul)
    print("x_w_mat_matmul:", x_w_mat_matmul)
    print("w_x_mat_multiply",w_x_mat_multiply)
    print("x_w_mat_multiply", x_w_mat_multiply)
x1.shape: (1, 2)
W.shape: (2, 2)
x.shape: (2, 2)
w_x_start.shape: (2, 2)
w_x_dot.shape: (2, 2)
x_w_dot.shape: (2, 2)
x1_w1_matmul.shape:: (1, 2)
做Array数组运算时:
 
w_x_start: [[ 1  6]
 [ 6 16]]
w_x_dot: [[ 5 11]
 [11 25]]
x_w_dot: [[10 14]
 [14 20]]
w_x_matmul: [[ 5 11]
 [11 25]]
x_w_matmul: [[10 14]
 [14 20]]
w_x_multiply: [[ 1  6]
 [ 6 16]]
x_w_multiply: [[ 1  6]
 [ 6 16]]
x1_w1_matmul: [[ 7 10]]
做matrix矩阵运算时:
 
w_x_mat_start: [[ 5 11]
 [11 25]]
x_w_mat_start: [[10 14]
 [14 20]]
x_w_mat_dot: [[10 14]
 [14 20]]
w_x_mat_dot: [[ 5 11]
 [11 25]]
w_x_mat_matmul: [[ 5 11]
 [11 25]]
x_w_mat_matmul: [[10 14]
 [14 20]]
w_x_mat_multiply [[ 1  6]
 [ 6 16]]
x_w_mat_multiply [[ 1  6]
 [ 6 16]]

python中转置的优先级高于乘法运算 例如:

a = np.mat([[2, 3, 4]])
b = np.mat([[1,2,3]] )
d=a*b.T
print(d)

结果是

[[20]]

其中a为1行3列,b也为1行3列,按理来说直接计算a*b是不能运算,但是计算d=a*b.T是可以的,结果是20,说明运算顺序是先转置再计算a与b转置的积,*作为矩阵乘法,值得注意的在执行*运算的时候必须符合行列原则。

numpy中tile()函数的用法

b = tile(a,(m,n)):即是把a数组里面的元素复制n次放进一个数组c中,然后再把数组c复制m次放进一个数组b中,通俗地讲就是将a在行方向上复制m次,在列方向上复制n次。

python中的 sum 和 np.sum 是不一样的,如果只写sum的话,表示的是数组中对应的维度相加,如果写 np.sum 的话,表示一个数组中的维数和列数上的数都加在一起。

如下图所示:

python numpy中multiply与*及matul 的区别说明

补充:总结:numpy中三个乘法运算multiply,dot和* 的区别

引言:

本人在做机器学习的练习1的时候,时常抛出错误:

python numpy中multiply与*及matul 的区别说明

Not aligned是什么意思呢?

意思是两个矩阵相乘无意义。

线性代数中mxn 和 nxp的矩阵才能相乘,其结果是mxp的矩阵。

出错源代码:

def gradientDescent(X,y,theta,alpha,iteration):
    colunms = int(theta.ravel().shape[1])
    thetai = np.matrix(np.zeros(theta.shape))
    cost = np.zeros(iteration)
                       
    for i in range(iteration):
        error = X*theta.T-y
        for j in range(colunms):
            a = np.sum(error*X[:,j])/len(X) ########## error!
            thetai[0,j] = thetai[0,j] - alpha*a
            
        theta = thetai    
        cost[i] = computeCost(X, y, theta)        
    return theta,cost

这里error是一个nx1的矩阵,theta.T也是一个nx1的矩阵。

而矩阵之间*运算符表示矩阵乘法。我们这里想实现矩阵的对应元素相乘,因此应该用np.multiply()实现。

总结:

(读者可使用简单的举例自行验证)

1.*用法:

矩阵与矩阵:矩阵乘法(matrix)

数组与数组:对应位置相乘(array)

2.np.dot()用法:

矩阵相乘的结果

3.np.multiply()用法:

数组、矩阵都得到对应位置相乘。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 爬虫模拟登陆知乎
Sep 23 Python
Python实现的多线程http压力测试代码
Feb 08 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
Python3.7 新特性之dataclass装饰器
May 27 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
Django 过滤器汇总及自定义过滤器使用详解
Jul 19 Python
python中列表的切片与修改知识点总结
Jul 23 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
python实现从wind导入数据
Dec 03 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
python文本处理的方案(结巴分词并去除符号)
Django操作cookie的实现
May 26 #Python
pandas中DataFrame检测重复值的实现
python 中的@运算符使用
May 26 #Python
Python 实现定积分与二重定积分的操作
May 26 #Python
python 解决微分方程的操作(数值解法)
python 实现体质指数BMI计算
May 26 #Python
You might like
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
php上传图片类及用法示例
2016/05/11 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
PHP简单遍历对象示例
2016/09/28 PHP
扩展String功能方法
2006/09/22 Javascript
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
详解JS面向对象编程
2016/01/24 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
Python 的 Socket 编程
2015/03/24 Python
python对日志进行处理的实例代码
2018/10/06 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
历史系自荐信范文
2013/12/24 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang