Python中如何基于向量和矩阵绘制函数图像
矩阵/向量参数函数的网格适配可视化方案
核心逻辑是利用numpy的广播机制对齐网格采样点和矩阵运算的维度,完全避免逐点循环,实现步骤如下:
- 先用
numpy.meshgrid生成x、y轴的网格采样矩阵X、Y,和普通二维函数绘图的初始化逻辑完全一致 - 将
X、Y分别展平为一维数组后按列堆叠,得到形状为(N, 向量维度)的采样点矩阵,其中N为总采样点数,每一行对应一个空间采样点的向量形式 - 直接将采样点矩阵代入带矩阵/向量参数的函数做批量运算,numpy会自动处理维度匹配,不需要单独遍历每个采样点
- 运算得到的结果是一维数组,将其
reshape为和X、Y相同的形状,即可直接传入matplotlib的绘图接口使用
完整示例(二次型函数绘图)
以下是二次型函数 f(v) = v^T A v 的实现代码,其中A为2×2参数矩阵,v为二维输入向量:
import numpy as np import matplotlib.pyplot as plt # 定义参数矩阵 A = np.array([[2, 1], [1, 3]]) # 生成xy平面网格 x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) # 网格转为批量向量 sample_vectors = np.stack([X.ravel(), Y.ravel()], axis=1) # 批量计算所有采样点的函数值 Z = np.diag(sample_vectors @ A @ sample_vectors.T).reshape(X.shape) # 3D表面绘图 fig = plt.figure(figsize=(8, 6)) ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('f(v)') plt.show()
扩展说明
如果你的输入向量维度高于2,只需要调整stack步骤的维度即可,广播机制会自动适配批量运算逻辑,运算效率比逐点for循环高2~3个数量级。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

