现在你已经了解了什么是向量以及如何使用 NumPy 数组表示它们,接下来我们将学习一些可以在向量上执行的基本运算。其中两个最基础的运算是向量加法和减法。这些运算是按元素进行的,意味着它们对所涉及向量的对应分量进行操作。向量加法两个向量的相加很简单。你只需将每个向量的对应元素相加即可。为了使此运算有效,向量必须具有相同数量的元素,也就是说它们必须具有相同的维度或长度。在数学上,如果你有两个 $n$维向量,$\vec{u}$ 和 $\vec{v}$:$$ \vec{u} = [u_1, u_2, \dots, u_n] $$ $$ \vec{v} = [v_1, v_2, \dots, v_n] $$它们的和,$\vec{w} = \vec{u} + \vec{v}$,计算如下:$$ \vec{w} = [u_1 + v_1, u_2 + v_2, \dots, u_n + v_n] $$例如,我们来相加两个3维向量: $\vec{u} = [1, 2, 3]$ $\vec{v} = [4, 5, 6]$和是: $\vec{u} + \vec{v} = [1+4, 2+5, 3+6] = [5, 7, 9]$几何解释在几何上,向量加法可以通过将第二个向量 ($\vec{v}$) 的尾部放在第一个向量 ($\vec{u}$) 的头部来描绘。结果向量和 ($\vec{u} + \vec{v}$) 从原点($\vec{u}$ 的尾部)开始,结束于重新定位的 $\vec{v}$ 的头部。这通常被称为“首尾相接”规则。或者,当两个原始向量都从原点开始时,它形成由这两个向量构成的平行四边形的对角线。{"layout": {"title": "向量加法:u + v", "xaxis": {"range": [-1, 7], "title": "x轴", "zeroline": true, "zerolinewidth": 1, "zerolinecolor": "#adb5bd"}, "yaxis": {"range": [-1, 7], "title": "y轴", "zeroline": true, "zerolinewidth": 1, "zerolinecolor": "#adb5bd"}, "showlegend": true, "annotations": [{"x": 2, "y": 3, "ax": 0, "ay": 0, "xref": "x", "yref": "y", "axref": "x", "ayref": "y", "showarrow": true, "arrowhead": 2, "arrowsize": 1, "arrowwidth": 2, "arrowcolor": "#4263eb"}, {"x": 6, "y": 4, "ax": 2, "ay": 3, "xref": "x", "yref": "y", "axref": "x", "ayref": "y", "showarrow": true, "arrowhead": 2, "arrowsize": 1, "arrowwidth": 2, "arrowcolor": "#f06595"}, {"x": 6, "y": 4, "ax": 0, "ay": 0, "xref": "x", "yref": "y", "axref": "x", "ayref": "y", "showarrow": true, "arrowhead": 2, "arrowsize": 1, "arrowwidth": 2, "arrowcolor": "#74b816", "text": "u+v=[6,4]", "xanchor": "left", "yanchor": "bottom"}], "width": 500, "height": 500, "margin": {"l": 50, "r": 50, "b": 50, "t": 50}}, "data": [{"x": [0, 2], "y": [0, 3], "type": "scatter", "mode": "lines", "line": {"color": "#4263eb", "width": 2}, "name": "u = [2, 3]"}, {"x": [2, 6], "y": [3, 4], "type": "scatter", "mode": "lines", "line": {"color": "#f06595", "width": 2}, "name": "v = [4, 1] (在u的头部)"}, {"x": [0, 4], "y": [0, 1], "type": "scatter", "mode": "lines", "line": {"color": "#f06595", "dash": "dash", "width": 1}, "name": "v (原始位置)"}, {"x": [0, 6], "y": [0, 4], "type": "scatter", "mode": "lines", "line": {"color": "#74b816", "width": 3}, "name": "u + v = [6, 4]"}, {"x": [4, 6], "y": [1, 4], "type": "scatter", "mode": "lines", "line": {"color": "#4263eb", "dash": "dash", "width": 1}, "name": "u (平行四边形补全)"}]}使用首尾相接法进行向量加法。向量 $\vec{u}$(蓝色)与向量 $\vec{v}$(粉色,已移动)相加。结果向量 $\vec{u}+\vec{v}$(绿色)从原点到移动后的 $\vec{v}$ 的尖端。虚线表示平行四边形的补全。在NumPy中的实现NumPy 使向量加法变得非常直观。你可以直接对表示向量的 NumPy 数组使用标准 + 运算符。NumPy 会自动处理按元素的加法。import numpy as np # 定义两个NumPy数组作为向量 u = np.array([1, 2, 3]) v = np.array([4, 5, 6]) # 相加向量 w = u + v print(f"向量 u: {u}") print(f"向量 v: {v}") print(f"和 u + v: {w}")Output:向量 u: [1 2 3] 向量 v: [4 5 6] 和 u + v: [5 7 9]请记住,如果你尝试相加不同长度的向量,NumPy 会引发 ValueError,因为无法执行按元素操作。# 不兼容形状的例子 a = np.array([1, 2]) b = np.array([3, 4, 5]) try: c = a + b except ValueError as e: print(f"向量 a 和 b 相加错误: {e}")Output:向量 a 和 b 相加错误: operands could not be broadcast together with shapes (2,) (3,)向量减法向量减法与加法类似。你将第二个向量的对应元素从第一个向量中减去。同样,两个向量必须具有相同的维度。如果你有两个 $n$维向量,$\vec{u}$ 和 $\vec{v}$:$$ \vec{u} = [u_1, u_2, \dots, u_n] $$ $$ \vec{v} = [v_1, v_2, \dots, v_n] $$它们的差,$\vec{d} = \vec{u} - \vec{v}$,计算如下:$$ \vec{d} = [u_1 - v_1, u_2 - v_2, \dots, u_n - v_n] $$例如,使用之前相同的向量 $\vec{u}$ 和 $\vec{v}$: $\vec{u} = [1, 2, 3]$ $\vec{v} = [4, 5, 6]$差是: $\vec{u} - \vec{v} = [1-4, 2-5, 3-6] = [-3, -3, -3]$几何解释在几何上,从 $\vec{u}$ 减去 $\vec{v}$ ($\vec{u} - \vec{v}$) 等同于将 $\vec{v}$ 的负向量加到 $\vec{u}$ 上 ($\vec{u} + (-\vec{v})$)。向量 $-\vec{v}$ 与 $\vec{v}$ 具有相同的模,但方向相反。另一种描绘 $\vec{u} - \vec{v}$ 的方式是,当 $\vec{u}$ 和 $\vec{v}$ 都从原点开始时,它是一个从 $\vec{v}$ 的头部开始,到 $\vec{u}$ 的头部结束的向量。{"layout": {"title": "向量减法:u - v", "xaxis": {"range": [-3, 5], "title": "x轴", "zeroline": true, "zerolinewidth": 1, "zerolinecolor": "#adb5bd"}, "yaxis": {"range": [-2, 4], "title": "y轴", "zeroline": true, "zerolinewidth": 1, "zerolinecolor": "#adb5bd"}, "showlegend": true, "annotations": [{"x": 2, "y": 3, "ax": 0, "ay": 0, "xref": "x", "yref": "y", "axref": "x", "ayref": "y", "showarrow": true, "arrowhead": 2, "arrowsize": 1, "arrowwidth": 2, "arrowcolor": "#4263eb"}, {"x": -2, "y": 2, "ax": 2, "ay": 3, "xref": "x", "yref": "y", "axref": "x", "ayref": "y", "showarrow": true, "arrowhead": 2, "arrowsize": 1, "arrowwidth": 2, "arrowcolor": "#f06595"}, {"x": -2, "y": 2, "ax": 0, "ay": 0, "xref": "x", "yref": "y", "axref": "x", "ayref": "y", "showarrow": true, "arrowhead": 2, "arrowsize": 1, "arrowwidth": 2, "arrowcolor": "#74b816", "text": "u-v=[-2,2]", "xanchor": "right", "yanchor": "bottom"}], "width": 500, "height": 500, "margin": {"l": 50, "r": 50, "b": 50, "t": 50}}, "data": [{"x": [0, 2], "y": [0, 3], "type": "scatter", "mode": "lines", "line": {"color": "#4263eb", "width": 2}, "name": "u = [2, 3]"}, {"x": [0, -4], "y": [0, -1], "type": "scatter", "mode": "lines", "line": {"color": "#f06595", "width": 2}, "name": "-v = [-4, -1]"}, {"x": [2, -2], "y": [3, 2], "type": "scatter", "mode": "lines", "line": {"color": "#f06595", "width": 2}, "name": "-v (在u的头部)"}, {"x": [0, -2], "y": [0, 2], "type": "scatter", "mode": "lines", "line": {"color": "#74b816", "width": 3}, "name": "u - v = u + (-v) = [-2, 2]"}, {"x": [0, 4], "y": [0, 1], "type": "scatter", "mode": "lines", "line": {"color": "#adb5bd", "dash": "dash", "width": 1}, "name": "原始 v = [4, 1]"}]}使用 $\vec{u} + (-\vec{v})$ 方法进行向量减法。向量 $\vec{u}$(蓝色)与向量 $-\vec{v}$(粉色,已移动)相加。结果向量 $\vec{u}-\vec{v}$(绿色)从原点到移动后的 $-\vec{v}$ 的尖端。在NumPy中的实现与加法类似,NumPy 中的向量减法使用标准 - 运算符。import numpy as np # 定义两个向量 u = np.array([1, 2, 3]) v = np.array([4, 5, 6]) # 从向量 u 中减去向量 v d = u - v print(f"向量 u: {u}") print(f"向量 v: {v}") print(f"差 u - v: {d}") # 从向量 v 中减去向量 u d_reversed = v - u print(f"差 v - u: {d_reversed}")Output:向量 u: [1 2 3] 向量 v: [4 5 6] 差 u - v: [-3 -3 -3] 差 v - u: [3 3 3]请注意,与加法不同,减法中顺序很重要 ($\vec{u} - \vec{v}$ 通常与 $\vec{v} - \vec{u}$ 不同)。向量加法满足交换律 ($\vec{u} + \vec{v} = \vec{v} + \vec{u}$),但减法不满足。向量加法和减法是线性代数中的基本工具。它们构成机器学习算法中许多运算的基础,例如计算误差向量或更新特征权重。理解它们的工作原理,无论是在数学上还是在代码中,使用 NumPy 等库,都是构建线性代数基础的重要一步。