
1.4.2 点积和欧几里得空间
设有内积空间中的两个向量,将它们的内积定义为:

(1.4.2)
容易验证,这个内积的形式也符合内积的公理,所以就构成了一个内积空间。这个内积空间,也就是我们常说的欧几里得空间(简称欧氏空间,Euclidean Space)。
通常,也将(1.4.2)式的函数形式写成:

(1.4.3)
正如它的书写样式那样,人们给它取了另外一个名称:点积(Dot Product)。
这里特别提醒读者注意,有的资料把“点积”与“内积”混用,认为它们是一个对象的不同名称。经过以上阐述应该明确,点积是内积的一种具体形式,只不过根据这个定义,得到了最常见的内积空间——欧几里得空间。而我们所遇到的绝大多数问题,都是在欧几里得空间,这或许就是人们容易把两者混淆的原因吧。也是因为这个原因,在本书的后续内容中,如果不特别声明,都是在欧几里得空间。
为了深刻理解点积运算的含义,下面以我们最熟悉的平面空间中的两个向量为例,以
为基并创建直角坐标系,则向量中的
即为相应的坐标。按照点积的定义(1.4.3)式:

即为相应坐标积的和,这是代数形式的定义,此外,还有一种几何形式的定义:

其中分别为两个向量的大小,
是两个向量的夹角。
其实,这两种定义是等效的。如图1-4-1所示,两个向量与轴夹角分别为
,且
。
因为,所以:

根据几何形式的定义,可以将两个向量的内积理解为一个向量的大小与另外一个向量
在
的方向上的投影
的乘积。

图1-4-1
点积的一个典型应用就是计算力所做的功:

在具体计算的过程中,按照上述代数形式或者几何形式均可。
由于定义了点积,从而构建了欧几里得空间,其中的点、线、面关系符合欧几里得几何的原理,因此我们所熟悉的距离、角度等概念都可以在此基础上有明确的定义了,这些内容在1.5节继续探讨。
很多关于向量运算的资料,在说明点积的同时,会提到另外一种名为叉积的向量运算,在1.2.1节已经介绍过叉积的概念。从本节的角度来看,叉积并不能定义内积空间,请读者不要将两者混淆。
手工计算向量的点积,可以依据(1.4.3)式完成,我们在这里不对此做重点介绍,因为这是诸多线性代数教材中都少不了的。下面要演示的是如何用程序实现点积计算。

此处用一维数组表示向量,函数np.dot()实现了点积运算。在NumPy中还有另外一个名为inner的函数,它并非专用于实现前述“内积”运算。

对于一维数组而言,np.inner()和np.dot()的计算结果一样。但是,对于非一维数组,则有所不同。

np.dot()计算点积的过程如下:

显然,np.dot()所进行的点积计算与矩阵乘法一致(参阅2.1.5节)。

np.inner()的计算过程如下:

请注意比较两个函数的差异。
此外,Pandas的Series对象和DataFrame对象也都有名为dot()的方法实现点积运算。