numpy dot用法解释
一、 定义
NumPy库中dot()函数语法定义:
import numpy as np
np.dot(a, b, out=None) #该函数的作用是获取两个元素a,b的乘积.
数组的运算是元素级的,数组相乘的结果是各对应元素的积组成的数组,而对于矩阵而言,需要求的是点积,这里NumPy库提供了用于矩阵乘法的dot函数。
二、 实例
在jupyter notebook中执行的代码运算如下:
#dot函数的详解
>>> import numpy as np>>> np.dot(5,8)40
#如果arr1和arr都是一维数组,那么它返回的就是向量的内积。
>>> arr1 = np.array([2,3])>>> arr2 = np.array([4,5])>>> np.dot(arr1,arr2)23
#arr3是二维数组,arr4是向量,具体看向量是在矩阵左边还是右边,然后返回的是矩阵乘法
>>> arr3 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr3
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
>>> arr4 = np.array([1,2,3])
>>> arr4
array([1, 2, 3])
>>> print(arr3.shape,arr4.shape)
(3, 3) (3,)
>>> print(np.dot(arr3,arr4)) #此时arr4当作一个3x1的列向量
[14 32 50]
>>> print(np.dot(arr4,arr3)) #此时arr4当作一个1x3的行向量
[30 36 42]
#如果arr5和arr6都是二维数组,那么它返回的是矩阵乘法。
dot()函数可以通过NumPy库调用,也可以由数组实例对象进行调用。例如:a.dot(b) 与 np.dot(a,b)效果相同。但矩阵积计算不遵循交换律,np.dot(a,b) 和 np.dot(b,a) 得到的结果是不一样的。
>>> arr5 = np.array([[2,3],[4,5]])>>> arr5array([[2, 3],[4, 5]])>>> arr6 = np.array([[6,7],[8,9]])>>> arr6array([[6, 7],[8, 9]])>>> np.dot(arr5,arr6)array([[36, 41],[64, 73]])
>>> arr7 = np.array([[2,3,4],[5,6,7]])>>> arr7array([[2, 3, 4],[5, 6, 7]])>>> arr8 = np.arange(9).reshape(3,3)>>> arr8array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])>>> np.dot(arr7,arr8)array([[33, 42, 51],[60, 78, 96]])
多维情况例子如下:
>>> arr9 = np.arange(2*3*4).reshape(2,3,4)>>> arr9array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])>>> arr10 = np.arange(2*4*5).reshape(2,4,5)>>> arr10array([[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]],[[20, 21, 22, 23, 24],[25, 26, 27, 28, 29],[30, 31, 32, 33, 34],[35, 36, 37, 38, 39]]])>>> np.dot(arr9,arr10)array([[[[ 70, 76, 82, 88, 94],[ 190, 196, 202, 208, 214]],[[ 190, 212, 234, 256, 278],[ 630, 652, 674, 696, 718]],[[ 310, 348, 386, 424, 462],[1070, 1108, 1146, 1184, 1222]]],[[[ 430, 484, 538, 592, 646],[1510, 1564, 1618, 1672, 1726]],[[ 550, 620, 690, 760, 830],[1950, 2020, 2090, 2160, 2230]],[[ 670, 756, 842, 928, 1014],[2390, 2476, 2562, 2648, 2734]]]])>>> np.dot(arr9,arr10).shape(2, 3, 2, 5)
>>> arr11 = np.ones((1,3,5))>>> arr11array([[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]]])>>> arr12 = np.ones((5,6))*3>>> arr12array([[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.]])>>> np.dot(arr11,arr12)array([[[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.]]])>>> np.dot(arr11,arr12).shape(1, 3, 6)
>>> arr13 = np.ones((1,3,4,5))>>> arr13array([[[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]]]])>>> arr14 = np.ones((5,6))*3>>> arr14array([[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.],[3., 3., 3., 3., 3., 3.]])>>> np.dot(arr13,arr14)array([[[[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.]],[[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.]],[[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.],[15., 15., 15., 15., 15., 15.]]]])>>> np.dot(arr13,arr14).shape(1, 3, 4, 6)
>>> arr15 = np.ones((1,3,4,5))>>> arr16 = np.ones((2,5,4))*3>>> np.dot(arr15,arr16).shape(1, 3, 4, 2, 4)
a.shape |
b.shape |
np.dot(a,b).shape |
(2,3,4) |
(2,4,5) |
(2,3,2,5) |
(1,3,5) |
(5,6) |
(1,3,6) |
(1,3,4,5) |
(5,6) |
(1, 3, 4, 6) |
(1,3,4,5) |
(2,5,4) |
(1, 3, 4, 2, 4) |
只需a矩阵的最后一维dim等于b矩阵倒数第二维dim即可,对应二维情况就是第一个的列数等于第二个矩阵行数;也就是说点积发生在a,b矩阵最后两个维度上;
注意:不要使用秩为1的数组!!!
例如: x1 = np.array([1, 2, 3])
应该这么写: x1 = np.array([[1, 2, 3]]),包含两个中括号
也可以这么写:x1 = np.array([1, 2, 3]).reshpe((1, -1))
初始化矩阵时:
>>> arr17 = np.random.randn(5) #创建一个5个随机高斯数>>> print(arr17.shape)(5,)
应该使用行向量或者列向量创建
>>> arr17 = np.random.randn(1,5) #创建时使用行向量或者列向量>>> print(arr17.shape)(1, 5)>>> arr17 = np.random.randn(5,1)>>> print(arr17.shape)(5, 1)
或者使用reshape函数
>>> arr17 = np.random.randn(5).reshape(1,5)>>> print(arr17.shape)(1, 5)>>> arr17 = np.random.randn(5).reshape(5,1)>>> print(arr17.shape)(5,1)
矩阵运算时(使用keepdims = True):
A = np.random.randn(4,3)
B = np.sum(A, axis = 1, keepdims = True) # axis=0意思是沿竖直方向
we use (keepdims = True) to make sure that A.shape is (4,1) and not (4, ). It makes our code more rigorous.
我们使用(keepdims = True)来确保A.shape是(4,1)而不是(4,),它使我们的代码更加严格。
主要参考以下文章,如有不妥的地方欢迎大家指正。
参考:https://www.cnblogs.com/Shawnyi/p/10370815.html
https://blog.csdn.net/goddessblessme/article/details/79863479
https://blog.csdn.net/abcgkj/article/details/90723314
https://blog.csdn.net/txh3093/article/details/108883637
numpy dot用法解释相关推荐
- [转载] numpy.dot numpy.linalg.eig numpy.linalg.svd np.linalg.inv 用法 + 例子
参考链接: Python中的numpy.dot numpy.dot() x是mn 矩阵 ,y是nm矩阵 则x.dot(y) 得到m*m矩阵 >>> np.dot(3, 4) 12 & ...
- 【Data Mining】机器学习三剑客之Numpy常用用法总结
点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自AI蜗牛车,禁二次转载 一.前言 玩数据分析.数据挖掘.AI的都知道这个pyt ...
- numpy.where()用法
numpy.where() 用法详解 - massquantity - 博客园 numpy.where() 用法详解 - massquantity - 博客园
- 如何用简单的词语和用法解释Katana和OWIN?
本文翻译自:How to explain Katana and OWIN in simple words and uses? I have read many articles about the O ...
- python 中numpy dot函数的使用方法
这个函数在的数字信号处理中用处还是比较广泛的,函数的具体定义如下所示: numpy.dot(a, b, out=None) 该函数的作用是获取两个元素a,b的乘积,表示的含义如下所示: dot(a, ...
- 【Python数据清洗】numpy.take()用法
numpy.take()用法 学了Python很长时间了但是一直没有去研究take的使用方法 今天周末加班研究一下 写一个简单的笔记,基本上都是借鉴别人的 其旨在根据提供的索引值将元素形成数组输出,如 ...
- 关于numpy.take()用法
关于numpy.take()用法 此文章是对我当时使用错误后的改正,用以记录下来,并作分享. 首先用numpy定义一个二维数组 import numpy as np a = np.random.uni ...
- python numpy allclose用法及代码示例
python numpy allclose用法及代码示例 用法: numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False) 如果两个数 ...
- 关于TypeScript 问号点 a?.b 的用法解释
关于TypeScript 问号点 a?.b 的用法解释 let obj = {a:{b:3} } 解释:obj?.a?.c 等价于 obj && obj.a && ob ...
- vim 详细用法解释总结
vim 详细用法解释总结 VIM | vim操作大全 关于Vim vim是Linux下第二强大的编辑器. 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效. 如果是初 ...
最新文章
- 机器学习入门资源不完全汇总
- ML之多分类预测:以某个数据集为例从0到1深入理解科学预测之多分类问题的思路框架
- VTK:绘制箱形图 BoxChart用法实战
- HttpServletRequest简述
- 【MySQL】基于Docker的Mysql主从复制搭建
- 11.24 《阿猫阿狗2》精美包装艳丽登场
- 反卷积可视化工具--deconv-deep-vis-toolbox
- 宗成庆《自然语言理解》第5章作业
- 两个队列实现一个栈(Java)
- 前端工程师的第一个Flutter应用
- 大四求职经历——我只是一个普普通通的程序员
- JS中国标准时间格式转换
- 不知道免费去水印图片软件哪个好?来看看这3个软件
- 机器学习(六):特征降维和主成分分析法
- 酷睿i5 1155g7相当于什么水平 i51155g7属于哪个档次
- Mendix装备制造业应用 | 质量统计分析人工智能应用APP
- AI Studio vLoong能源AI挑战赛——异常检测赛A榜第三名方案
- 采购外系统——POC的重要性
- Python小甲鱼学习笔记11-15
- UG造型设计和模具设计的区别
热门文章
- Hulu推荐:小众又新颖的综艺
- 如何使用手机作为树莓派的显示屏幕
- 【kubernetes/k8s源码分析】CNI calico ipam源码分析
- SQL 已死,NoSQL才是王道?醒醒吧,别瞎说八道了
- FidMTF: An MTF Estimator (FidMTF:一种MTF估计方法)
- 算24点的一般方法及例题
- java 8中Comparator.comparing和reversed
- 1218. 最长定差子序列【我亦无他唯手熟尔】
- PS背后的神秘AI力量 是Adobe憋了十年的神功
- Could not locate executable null\bin\winutils.exe in the Hadoop binaries.