一、 定义

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用法解释相关推荐

  1. [转载] 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 & ...

  2. 【Data Mining】机器学习三剑客之Numpy常用用法总结

    点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自AI蜗牛车,禁二次转载 一.前言 玩数据分析.数据挖掘.AI的都知道这个pyt ...

  3. numpy.where()用法

    numpy.where() 用法详解 - massquantity - 博客园 numpy.where() 用法详解 - massquantity - 博客园

  4. 如何用简单的词语和用法解释Katana和OWIN?

    本文翻译自:How to explain Katana and OWIN in simple words and uses? I have read many articles about the O ...

  5. python 中numpy dot函数的使用方法

    这个函数在的数字信号处理中用处还是比较广泛的,函数的具体定义如下所示: numpy.dot(a, b, out=None) 该函数的作用是获取两个元素a,b的乘积,表示的含义如下所示: dot(a, ...

  6. 【Python数据清洗】numpy.take()用法

    numpy.take()用法 学了Python很长时间了但是一直没有去研究take的使用方法 今天周末加班研究一下 写一个简单的笔记,基本上都是借鉴别人的 其旨在根据提供的索引值将元素形成数组输出,如 ...

  7. 关于numpy.take()用法

    关于numpy.take()用法 此文章是对我当时使用错误后的改正,用以记录下来,并作分享. 首先用numpy定义一个二维数组 import numpy as np a = np.random.uni ...

  8. python numpy allclose用法及代码示例

    python numpy allclose用法及代码示例 用法: numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False) 如果两个数 ...

  9. 关于TypeScript 问号点 a?.b 的用法解释

    关于TypeScript 问号点 a?.b 的用法解释 let obj = {a:{b:3} } 解释:obj?.a?.c 等价于 obj && obj.a && ob ...

  10. vim 详细用法解释总结

    vim 详细用法解释总结 VIM | vim操作大全 关于Vim vim是Linux下第二强大的编辑器. 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效. 如果是初 ...

最新文章

  1. 机器学习入门资源不完全汇总
  2. ML之多分类预测:以某个数据集为例从0到1深入理解科学预测之多分类问题的思路框架
  3. VTK:绘制箱形图 BoxChart用法实战
  4. HttpServletRequest简述
  5. 【MySQL】基于Docker的Mysql主从复制搭建
  6. 11.24 《阿猫阿狗2》精美包装艳丽登场
  7. 反卷积可视化工具--deconv-deep-vis-toolbox
  8. 宗成庆《自然语言理解》第5章作业
  9. 两个队列实现一个栈(Java)
  10. 前端工程师的第一个Flutter应用
  11. 大四求职经历——我只是一个普普通通的程序员
  12. JS中国标准时间格式转换
  13. 不知道免费去水印图片软件哪个好?来看看这3个软件
  14. 机器学习(六):特征降维和主成分分析法
  15. 酷睿i5 1155g7相当于什么水平 i51155g7属于哪个档次
  16. Mendix装备制造业应用 | 质量统计分析人工智能应用APP
  17. AI Studio vLoong能源AI挑战赛——异常检测赛A榜第三名方案
  18. 采购外系统——POC的重要性
  19. Python小甲鱼学习笔记11-15
  20. UG造型设计和模具设计的区别

热门文章

  1. Hulu推荐:小众又新颖的综艺
  2. 如何使用手机作为树莓派的显示屏幕
  3. 【kubernetes/k8s源码分析】CNI calico ipam源码分析
  4. SQL 已死,NoSQL才是王道?醒醒吧,别瞎说八道了
  5. FidMTF: An MTF Estimator (FidMTF:一种MTF估计方法)
  6. 算24点的一般方法及例题
  7. java 8中Comparator.comparing和reversed
  8. 1218. 最长定差子序列【我亦无他唯手熟尔】
  9. PS背后的神秘AI力量 是Adobe憋了十年的神功
  10. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.