别再死记公式了!用Python+NumPy图解向量的点积、叉积与几何意义

张开发
2026/6/21 11:34:55 15 分钟阅读
别再死记公式了!用Python+NumPy图解向量的点积、叉积与几何意义
用PythonNumPy图解向量的点积、叉积与几何意义线性代数是数据科学和机器学习的基石而向量运算则是线性代数的核心。但传统的数学教材往往充斥着晦涩的公式和抽象的定义让初学者望而生畏。本文将带你用Python和NumPy通过可视化的方式直观理解向量的点积、叉积及其几何意义告别死记硬背公式的学习方式。1. 准备工作与环境配置在开始之前我们需要确保Python环境中安装了必要的库。推荐使用Anaconda发行版它已经包含了我们所需的大部分工具。import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D如果你还没有安装这些库可以使用以下命令安装pip install numpy matplotlib为了获得更好的可视化效果我们还需要配置Matplotlib的样式plt.style.use(seaborn) plt.rcParams[figure.figsize] (10, 6) plt.rcParams[font.size] 122. 向量的基本概念与可视化2.1 向量的定义与表示向量是具有大小和方向的量在Python中可以用NumPy数组表示。让我们创建两个二维向量并绘制它们# 定义两个二维向量 v1 np.array([3, 1]) v2 np.array([1, 2]) # 绘制向量 fig, ax plt.subplots() ax.quiver(0, 0, v1[0], v1[1], anglesxy, scale_unitsxy, scale1, colorr, label向量v1 (3,1)) ax.quiver(0, 0, v2[0], v2[1], anglesxy, scale_unitsxy, scale1, colorb, label向量v2 (1,2)) # 设置图形范围 ax.set_xlim([0, 4]) ax.set_ylim([0, 3]) ax.set_aspect(equal) ax.grid(True) ax.legend() plt.title(二维向量可视化) plt.show()这段代码会绘制两个从原点出发的向量红色表示v1(3,1)蓝色表示v2(1,2)。通过这种可视化方式我们可以直观地看到向量的大小和方向。2.2 向量的基本运算向量的四则运算在NumPy中非常简单# 向量加法 v_add v1 v2 # 结果为 [4, 3] # 向量减法 v_sub v1 - v2 # 结果为 [2, -1] # 向量数乘 v_scalar 2 * v1 # 结果为 [6, 2] # 向量点积 dot_product np.dot(v1, v2) # 结果为 3*1 1*2 5 # 向量叉积 (二维情况) cross_product np.cross(v1, v2) # 结果为 3*2 - 1*1 53. 点积的几何意义与可视化3.1 点积的计算与投影点积的一个重要几何意义是一个向量在另一个向量上的投影长度。让我们通过动画来演示这一概念# 创建图形和坐标轴 fig, ax plt.subplots() ax.set_xlim(-1, 4) ax.set_ylim(-1, 3) ax.grid(True) ax.set_aspect(equal) # 绘制原始向量 v1_plot ax.quiver(0, 0, v1[0], v1[1], anglesxy, scale_unitsxy, scale1, colorr) v2_plot ax.quiver(0, 0, v2[0], v2[1], anglesxy, scale_unitsxy, scale1, colorb) # 计算投影向量 proj_length np.dot(v1, v2) / np.linalg.norm(v2) proj_vector (proj_length / np.linalg.norm(v2)) * v2 # 绘制投影线 projection_line, ax.plot([], [], k--) projection_vector ax.quiver(0, 0, 0, 0, anglesxy, scale_unitsxy, scale1, colorg) def update(frame): # 计算中间向量 t frame / 100 current_v1 t * v1 # 更新向量显示 v1_plot.set_UVC(current_v1[0], current_v1[1]) # 计算当前投影 current_proj_length np.dot(current_v1, v2) / np.linalg.norm(v2) current_proj_vector (current_proj_length / np.linalg.norm(v2)) * v2 # 更新投影显示 projection_line.set_data([current_v1[0], current_proj_vector[0]], [current_v1[1], current_proj_vector[1]]) projection_vector.set_UVC(current_proj_vector[0], current_proj_vector[1]) return v1_plot, projection_line, projection_vector ani FuncAnimation(fig, update, frames100, interval50, blitTrue) plt.title(点积的投影几何意义演示) plt.legend([v1, v2, 投影]) plt.show()这个动画展示了v1向量逐渐增长时它在v2向量上的投影如何变化。最终点积的值等于v1的长度乘以v2的长度再乘以它们夹角的余弦。3.2 点积的应用场景点积在实际中有许多重要应用判断向量正交性当两个向量的点积为零时它们互相垂直计算夹角可以通过点积公式反推两个向量之间的夹角相似度计算在机器学习中点积常用于计算向量之间的相似度# 计算两个向量夹角 def angle_between(v1, v2): cos_theta np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) return np.arccos(cos_theta) * 180 / np.pi # 转换为角度 angle angle_between(v1, v2) # 计算v1和v2的夹角4. 叉积的几何意义与可视化4.1 叉积的计算与几何意义叉积的结果是一个向量其大小等于两个向量构成的平行四边形的面积方向垂直于这两个向量所在的平面。在二维情况下叉积的结果实际上就是这个平行四边形的有向面积。让我们可视化这一概念# 创建图形 fig, ax plt.subplots() ax.set_xlim(0, 4) ax.set_ylim(0, 3) ax.grid(True) ax.set_aspect(equal) # 绘制原始向量 ax.quiver(0, 0, v1[0], v1[1], anglesxy, scale_unitsxy, scale1, colorr, labelv1 (3,1)) ax.quiver(0, 0, v2[0], v2[1], anglesxy, scale_unitsxy, scale1, colorb, labelv2 (1,2)) # 绘制平行四边形 parallelogram plt.Polygon([[0, 0], v1, v1v2, v2], alpha0.3) ax.add_patch(parallelogram) # 计算叉积值 cross_val np.cross(v1, v2) # 添加文本标注 ax.text(1.5, 1, f面积 {abs(cross_val)}, fontsize12, bboxdict(facecolorwhite, alpha0.8)) plt.title(二维向量叉积的几何意义) plt.legend() plt.show()4.2 三维叉积的可视化在三维空间中叉积的结果是一个垂直于两个原始向量的新向量。让我们创建一个三维可视化# 创建三维向量 v3d_1 np.array([1, 0, 0]) v3d_2 np.array([0, 1, 0]) # 计算叉积 v3d_cross np.cross(v3d_1, v3d_2) # 创建三维图形 fig plt.figure() ax fig.add_subplot(111, projection3d) # 绘制向量 ax.quiver(0, 0, 0, v3d_1[0], v3d_1[1], v3d_1[2], colorr, arrow_length_ratio0.1, labelv1 (1,0,0)) ax.quiver(0, 0, 0, v3d_2[0], v3d_2[1], v3d_2[2], colorb, arrow_length_ratio0.1, labelv2 (0,1,0)) ax.quiver(0, 0, 0, v3d_cross[0], v3d_cross[1], v3d_cross[2], colorg, arrow_length_ratio0.1, label叉积 (0,0,1)) # 设置图形属性 ax.set_xlim([0, 1]) ax.set_ylim([0, 1]) ax.set_zlim([0, 1]) ax.set_xlabel(X轴) ax.set_ylabel(Y轴) ax.set_zlabel(Z轴) plt.title(三维向量叉积的几何意义) plt.legend() plt.show()4.3 叉积的应用场景叉积在计算机图形学和物理模拟中有广泛应用计算法向量用于确定多边形表面的朝向计算面积/体积可以方便地计算多边形面积或平行六面体体积判断相对方位通过叉积的符号可以判断两个向量的相对旋转方向# 计算三角形面积 def triangle_area(a, b, c): ab b - a ac c - a return 0.5 * np.linalg.norm(np.cross(ab, ac)) # 示例计算三角形面积 points np.array([[0, 0], [3, 1], [1, 2]]) area triangle_area(points[0], points[1], points[2])5. 向量运算在物理模拟中的应用5.1 力的合成与分解向量加法可以直观地表示力的合成。让我们模拟两个力的合成效果# 定义两个力向量 force1 np.array([3, 0]) # 水平向右的力 force2 np.array([0, 2]) # 垂直向上的力 # 计算合力 resultant_force force1 force2 # 绘制力的合成 fig, ax plt.subplots() ax.quiver(0, 0, force1[0], force1[1], anglesxy, scale_unitsxy, scale1, colorr, label力1 (3,0)) ax.quiver(force1[0], force1[1], force2[0], force2[1], anglesxy, scale_unitsxy, scale1, colorb, label力2 (0,2)) ax.quiver(0, 0, resultant_force[0], resultant_force[1], anglesxy, scale_unitsxy, scale1, colorg, label合力 (3,2)) # 设置图形属性 ax.set_xlim(0, 4) ax.set_ylim(0, 3) ax.grid(True) ax.set_aspect(equal) plt.title(力的合成 - 向量加法) plt.legend() plt.show()5.2 力矩的计算力矩是叉积的一个重要应用它等于力向量与力臂向量的叉积# 定义力臂和力 r np.array([2, 0, 0]) # 力臂向量 (x轴方向) F np.array([0, 3, 0]) # 力向量 (y轴方向) # 计算力矩 torque np.cross(r, F) # 可视化 fig plt.figure() ax fig.add_subplot(111, projection3d) # 绘制向量 ax.quiver(0, 0, 0, r[0], r[1], r[2], colorb, arrow_length_ratio0.1, label力臂) ax.quiver(r[0], r[1], r[2], F[0], F[1], F[2], colorr, arrow_length_ratio0.1, label力) ax.quiver(0, 0, 0, torque[0], torque[1], torque[2], colorg, arrow_length_ratio0.1, label力矩) # 设置图形属性 ax.set_xlim([0, 3]) ax.set_ylim([0, 3]) ax.set_zlim([0, 3]) ax.set_xlabel(X轴) ax.set_ylabel(Y轴) ax.set_zlabel(Z轴) plt.title(力矩计算 - 向量叉积应用) plt.legend() plt.show()6. 高级应用向量运算在机器学习中的应用6.1 特征相似度计算在机器学习中点积常用于计算向量之间的相似度。例如在推荐系统中计算用户偏好向量与物品特征向量的相似度# 用户偏好向量 user_pref np.array([0.8, 0.2, 0.5]) # 物品特征向量 item1 np.array([0.7, 0.3, 0.4]) item2 np.array([0.1, 0.9, 0.2]) # 计算余弦相似度 def cosine_similarity(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) sim1 cosine_similarity(user_pref, item1) sim2 cosine_similarity(user_pref, item2) print(f物品1相似度: {sim1:.3f}, 物品2相似度: {sim2:.3f})6.2 主成分分析(PCA)PCA是一种降维技术它利用向量的特征值和特征向量来确定数据的主要变化方向from sklearn.decomposition import PCA # 生成随机数据 np.random.seed(42) data np.random.randn(100, 3) np.random.rand(3, 3) # 创建有相关性的数据 # 执行PCA pca PCA(n_components2) principal_components pca.fit_transform(data) # 绘制结果 plt.scatter(principal_components[:, 0], principal_components[:, 1]) plt.xlabel(第一主成分) plt.ylabel(第二主成分) plt.title(PCA降维结果) plt.grid(True) plt.show()6.3 支持向量机(SVM)中的向量应用SVM的核心思想是找到一个最优超平面使得两个类别之间的间隔最大化这依赖于向量几何的概念from sklearn.svm import SVC from sklearn.datasets import make_blobs # 生成可分数据 X, y make_blobs(n_samples50, centers2, random_state42) # 训练SVM模型 model SVC(kernellinear, C1000) model.fit(X, y) # 绘制决策边界 plt.scatter(X[:, 0], X[:, 1], cy, cmapautumn) # 创建网格来评估模型 ax plt.gca() xlim ax.get_xlim() ylim ax.get_ylim() # 创建网格来评估模型 xx np.linspace(xlim[0], xlim[1], 30) yy np.linspace(ylim[0], ylim[1], 30) YY, XX np.meshgrid(yy, xx) xy np.vstack([XX.ravel(), YY.ravel()]).T Z model.decision_function(xy).reshape(XX.shape) # 绘制决策边界和间隔 ax.contour(XX, YY, Z, colorsk, levels[-1, 0, 1], alpha0.5, linestyles[--, -, --]) ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s100, linewidth1, facecolorsnone, edgecolorsk) plt.title(SVM分类器与最大间隔超平面) plt.show()

更多文章