简介按照数学家的说法,点积是将两个等长的向量作为输入,返回一个数(标量)的运算。矢量A和矢量B的点积表示为A·B。在线性代数中,点积是输入向量中每个对应元素的乘积之和。本文重点介绍点积的定义和相关代码的实现。让我们开始吧!例如,考虑我们去商店购买商品的购物清单,如下所示:数量|单位成本葡萄酒|2|12.50橙色|12|0.50松饼|3|1.75假设我们需要计算我们的购物账单,这时候我们需要获取每件商品的成本并相加。要计算每个项目的单独成本,我们需要将项目的数量乘以其单价。换句话说,我们需要执行的计算是(212.50)+(120.5)+(3*1.75)=36.25。上述操作称为加权和。此外,如果我们将数量和单价表示为两个向量,我们也可以将加权和表示为点积。如下:quantity=[2,12,3]costs=[12.5,.5,1.75]sum(q*cforq,cinzip(quantity,costs))上面代码中的点积运算相当于所有商品的单价乘以对应数量的总和得到的总和。使用Numpy中的点积,同样的操作也可以在NumPy中实现,并获得更好的性能。示例代码如下:importnumpyasnpquantity=np.array([2,12,3])costs=np.array([12.5,.5,1.75])np.sum(quantity*costs)#element-明智的乘法NumPy有一种更简单的求和方法。这可以通过三种不同的方式实现。quantity.dot(costs)#dotproductway1np.dot(quantity,costs)#dotproductway2quantity@costs#dotproductway3一维数组操作在Python中行乘列时需要特别小心。让我们考虑以下二维数组row_vec和col_vec,如下所示:row_vec=np.arange(5).reshape(1,5)col_vec=np.arange(0,50,10).reshape(5,1)输出是:row_vec=array([[0,1,2,3,4]])col_vec=array([[0],[10],[20],[30],[40]])如果我们使用计算内积,输出如下:out=np.dot(row_vec,col_vec)输出为:array([[300]]但如果我们将两者互换呢?输出如下:out=np.dot(col_vec,row_vec)输出为: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_vecrow_vec和row_veccol_vec的输出是不一样的!我们现在有一个5行5列的A矩阵,而不是一个数字。让我们看一下结果中的任何元素,看看它来自哪里。回想一下,在Python中,第一个索引是0。我们考虑元素[1,2],这个值是20。它来自col_vec的第1行和第2列的两个向量的点积row_vec,两者相乘得到结果20。一维数组和二维数组的点积运算当我们结合一维数组和二维数组进行点击操作时,要多加小心。oned_vec=np.arange(5)#输出为数组([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)#outputisarray([300])np.dot(row_vec,oned_vec)#outputisarray([30])然而,如果我们交换相应的顺序,代码可能无法正常运行!np.dot(col_vec,oned_vec)np.dot(oned_vec,row_vec)输出:形状(5,1)和(5,)未对齐:1(dim1)!=5(dim0)形状(5,)和(1,5)notaligned:5(dim0)!=1(dim0)从上面的报错信息我们可以看出col_vec的shape是(5,1),而row_vec对应的shpae是(1,5),oned_vec对应的shape为(5,)。我们知道在对两个数组进行点积运算时,第一个数组的列数应该等于第二个数组的行数,所以上面的代码会显式的报上面的错误信息。同时上面的代码表明,如果在np.dot()的第一个参数中放置一个一维数组,那么oned_vec会被认为是一个形状为(1,5)的数组。同时,如果将它放在np.dot()的第二个参数中,那么oned_vec将被视为一个形状为(5,1)的数组。多维数组点积运算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.51+2.53=9以此类推。这里,由于w在右边,所以可以看做是一个2行1列的数组。我们将一个4行2列的数组乘以一个2行1列的数组,这将生成一个包含4个元素的一维数组。小结本文重点介绍了Numpy中点积的定义,以及相应的运算,并给出了相应的代码示例。
