【Python】详解Numpy中的点积运算

article/2025/11/3 14:49:30

1. 引言

根据数学家的说法,点积是一种运算,它取两个等长的向量作为输入,然后返回一个数字(标量)。向量A与向量B的点积用符号表示为A•B。在线性代数中,点积是输入向量中每个对应元素的乘积之和。

本文重点介绍点积的定义以及相关代码实现,闲话少说,我们直接开始吧!

2. 举个栗子

考虑一下我们去商店购买货品的购物单,如下所示:

Item    | Quantity | Unit Cost
Wine    | 2        | 12.50
Orange  | 12       | 0.50
Muffin  | 3        | 1.75

假设我们需要计算我们的购物账单,此时我们需要得到每件商品的成本,然后把它们加起来。要计算每个项目的单个成本,我们需要将该项目的数量乘以其单位价格即可。换句话说,我们需要进行的运算为(2*12.50)+(12*0.5)+(3*1.75)=36.25。上述操作被称为加权和。
此外,如果我们将数量和单位价格表示为两个向量,我们也可以将加权和表示为点积的形式。如下所示:

quantity = [2,12,3]
costs    = [12.5,.5,1.75]
sum(q*c for q,c in zip(quantity,costs))

上述代码中的点积运算等价于所有物品的单价乘以对应数量求和后得到的总和。

3. 使用Numpy中的点积

同样的操作也可以在NumPy中实现,并获得较好的运行性能。
样例代码如下:

import numpy as np
quantity = np.array([2,12,3])
costs    = np.array([12.5,.5,1.75])
np.sum(quantity*costs) # element-wise multiplication

使用NumPy进行求和的方式更加简单。可以用三种不同的方式实现。

quantity.dot(costs)    # dot product way 1
np.dot(quantity,costs) # dot product way 2
quantity @ costs       # dot product way 3

4. 一维数组运算

在Python中处理行与列相乘时需要特别小心。我们不妨考虑以下二维数组row_vec col_vec,如下所示:

row_vec = np.arange(5).reshape(1,5)
col_vec = np.arange(0,50,10).reshape(5,1)
Outputs are:
row_vec = 
array([[0, 1, 2, 3, 4]])
col_vec = 
array([[ 0],[10],[20],[30],[40]])

如果我们使用内积进行计算,输出如下:

out = np.dot(row_vec, col_vec)
Output is:
array([[300]]

但是如果我们将二者进行互换呢?输出如下:

out = np.dot(col_vec, row_vec)
Output is:
array([[  0,   0,   0,   0,   0],[  0,  10,  20,  30,  40],[  0,  20,  40,  60,  80],[  0,  30,  60,  90, 120],[  0,  40,  80, 120, 160]])

显然,col_vec*row_vecrow_vec*col_vec的输出是不一样的!我们现在有一个5行5列的矩阵,而不再是一个数字。让我们看看结果中任一个元素,看看它来自哪里。回想一下,在Python中,第一个索引是0。我们考虑元素out[1,2],此值为20。它来自col_vec第1行与row_vec 的第2列两个向量的点积,将两者相乘得到结果20。

5. 一维数组和二维数组点积运算

当我们把一维数组和二维数组结合起来进行点击运算时,我们应该更加小心。

oned_vec = np.arange(5) # output is array([0, 1, 2, 3, 4])
row_vec = np.arange(5).reshape(1,5)
col_vec = np.arange(0,50,10).reshape(5,1)
np.dot(oned_vec, col_vec) # output is array([300])
np.dot(row_vec, oned_vec) # output is array([30])

然而,如果我们交换相应的次序,代码可能无法正常运行!

np.dot(col_vec, oned_vec)
np.dot(oned_vec, row_vec)
Output:
shapes (5,1) and (5,) not aligned: 1 (dim 1) != 5 (dim 0)
shapes (5,) and (1,5) not aligned: 5 (dim 0) != 1 (dim 0)

从上述错误消息中,我们可以看到col_vec的shape为(5,1),row_vec对应的shpae为(1,5),而oned_vec对应的shape为(5,)。我们知道两个数组进行点积运算,第一个数组的列数应该等于第二个数组的行数,所以上述代码会显式地报上面的错误信息。同时上述代码说明,如果将一个一维的数组放到np.dot()第一个参数位置,则此时oned_vec将被当做shape为(1,5)的数组,同时如果将其放到np.dot()的第二个参数位置,则此时oned_vec将被当做shape为(5,1)的数组。

6. 多维数组点积运算

NumPy还允许我们创建具有多个值输出的数组,而不仅仅是一个值。这取决于输入数组的形状,如下所示:

D = np.array([[1,3],[2,5],[2,7],[3,2]])
w = np.array([1.5,2.5])
np.dot(D,w) # [9,15.5,20.5,9.5]

通过上述示例,我们可以看出,1.5*1+2.5*3=9依次类推。这里,因为w在右边,所以它可以视为2行1列的数组。我们用一个4行2列的数组乘以一个2行1列的数组,将产生一个包含4个元素的一维数组。

7. 总结

本文重点介绍了Numpy中点积的定义,以及相应的运算,并给出了相应的代码示例。
您学废了吗?

在这里插入图片描述
关注公众号《AI算法之道》,获取更多AI算法资讯。


http://chatgpt.dhexx.cn/article/eGBsBkt0.shtml

相关文章

cuda点积运算

最近在研究并行运算的规约算法,在看《GPU高性能编程CUDA实战》这本书中点积运算时,有些问题想了很久,记录下来; 注点积公式:(dot(A,B)a1*b1a2*b2...an*bn) 书上例子算点积运算时分为了以下几步…

Unity3D C#数学系列之点积

文章目录 1 定义2 几何意义3 向量a向量b xaxbyaybzazb4 应用案例4.1 求两向量的夹角4.2 判断两向量是否垂直4.3 判断NPC是否在攻击范围内4.4 已知入射光线和表面法线求反射光线 5 项目 1 定义 可知,点积得到的是一个标量,这个标量代表什么呢&#xff1f…

内积、点积和坐标

内积是一个纯数学概念,在向量空间中,只要满足一定的性质(正性、定性、可加性、齐性和共轭对称性)的函数运算就可以成为内积,因此具体的内积具有很多种形式。 点积是定义在空间上的一种内积,具体的形式为&am…

点积与投影的关系

点积与投影的关系 一个向量在另一个单位向量上的投影长度,等于这两个向量的点积。 怎么理解 a、b、c分别为三个向量,如果有abc,那么c在某个向量上的投影值等于a和b分别在该向量上的投影值相加(反方向的投影为负值) i,j分别是向…

防抖与节流的个人理解及其对应的应用场景

什么是防抖和节流,他们的应用场景有哪些 防抖 (debounce) 防抖,顾名思义,防止抖动,以免把一次事件误认为多次,敲键盘就是一个每天都会接触到的防抖操作。 想要了解一个概念,必先了解概念所应用的场景。在…

JS防抖和节流

欢迎学习交流!!! 持续更新中… 文章目录 防抖节流二者区别应用场景 防抖和节流都是为了项目优化而出现的,官方没有具体定义的,他们的出现主要是为了解决一些短时间内连续执行的事件带来性能上的不佳和内存的消耗巨大等…

手写防抖节流

文章目录 手写前端常用技巧-防抖节流防抖节流1. 首节流2. 尾节流3. 首尾节流 总结 手写前端常用技巧-防抖节流 防抖:当持续触发事件时,一定时间内没有再触发事件,才会在一段时间之后触发事件处理函数。 节流:当持续触发事件时&am…

防抖和节流

1. 什么是防抖 防抖策略(debounce)是当事件被触发后,延迟 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。 1.2. 防抖的应用场景 用户在输入框中连续输入一串字符时,可以通过防抖策略&…

lodash节流

滚动条事件优化 可以用 lodash节流 npm i -S lodash Lodash 简介 | Lodash 中文文档 | Lodash 中文网

JS 节流

JS 节流 说明: 1.对于高频触发的监听事件函数,实现对于触发次数的间接限制,从而降低触发次数. 2.关键点在于控制时间周期内,阻止触发内容,即上锁;在时间周期外解锁,触发内容。 3.主要是对间隔时间限制,在规定时间内,阻止触发事件内指定程序或默认抛弃 4.三种实现节流方式:时间…

个人对于节流的理解!

文章目录 前言一、节流是什么?二、节流的实现总结 前言 防抖和节流是前端经常会被提起以及涉及到的内容,更是前端性能优化的手段之一,我初学防抖和节流也遭遇了很多坑,所以想写一篇博客一则当作学习笔记,二则如果能帮…

节流的基本使用以及理解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、节流是什么?应用场景 二、使用步骤1.定义节流阀2.绑定 mousemove 事件3. 判断节流阀是否为空,如果不为空,说明距离上一次执行时间还没有…

图片跟随鼠标样式跟随效果(附完整代码及效果)

Demo效果如下&#xff1a; 完整代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta …

前端必备技能之----节流

&#xff08;引言----和大佬们出去吃饭总是会有收获的&#xff0c;这个知识点是我之前从未考虑过的事情&#xff0c;但是在现代的设计开发之中却是非常重要且使用频率非常之高的两个概念。&#xff09; 作为一个前端的初学者&#xff0c;因为之前淋过雨&#xff0c;所以想为同…

html锚点链接小案例

案例1&#xff1a;回到首页 <html ><head><meta charset"utf-8"><title></title><style type"text/css"> *{border: 0;margin: 0; padding: 0;}.box1, .box2{height: 3000px; width: 200px;background-color: green…

HTML锚点为什么叫hash,锚点链接和hash属性

相信大家挺经常见过这样一个效果。有一个很长很长的页面,分成好几部分,目录中一点击,就能定位到页面某个位置。 例如:有这样一个目录,例如你点击一下“HTML”,就会直接跳转到“HTML”的页面位置 这就是锚点链接(也叫书签链接),常常用于那些内容庞大繁琐的网页,通过点击…

html5添加锚点锭接,为页面添加锚点链接

为页面添加锚点链接 开哈础是发通待质击文以为近哈知按分过续的战发中会遇到为页面中添加锚点链接的需求,即在页面中点击某处,可以跳转到与之有联系的地方。添加锚点的方法比较多,在这儿,把常用的方法大享上。是发了概开程态间些告人屏果会区。一一是控标近体到班都一从小述…

菜鸟 html锚链接,Vue锚点链接

锚点链接是我们在开发中经常会用到的一个技术点&#xff0c;常见的常见有&#xff0c;页面内容过多&#xff0c;而我们不希望拿鼠标一直来回滚动&#xff0c;就需要用到锚点链接&#xff0c;以 " 目录 " 的方式来进行对应的跳转。 而在常见的项目中&#xff0c;锚点链…

制作图片锚点链接html,锚点链接怎么做

网页内容过多时我们可以使用锚点链接来进行位置的跳转&#xff0c;通过锚点链接我们不但可以指向文档&#xff0c;还能指向页面里的特定段落&#xff0c;这样就会便于我们来浏览网页中的内容&#xff0c;那么&#xff0c;锚点链接怎么实现呢&#xff1f;本篇文章就来给大家介绍…

web前端学习26(锚点链接)

文章目录 4.7.2 链接分类 4.7.2 链接分类 锚点链接&#xff1a;点我们点击链接&#xff0c;可以快速定位到页面中的某个位置。 在链接文本的href属性中&#xff0c;设置属性值为#名字的形式&#xff0c;如< a href"#two">第2集< /a> 点完这个链接就会跳…