You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现numpy向量/矩阵对应的函数图像绘制?

绘制NumPy矩阵对应的向量函数图像

嘿,我来帮你把多变量函数的绘图思路扩展到向量函数上!核心是根据向量函数的输入输出维度选择对应的可视化方式,下面分几种常见场景一步步讲,结合代码示例帮你落地。

先明确向量函数的类型

向量函数的本质是:输入一个n维向量(用NumPy矩阵表示),输出一个m维向量。不同的n和m组合,对应完全不同的可视化方法,我们从最常用的场景开始:


场景1:2D输入 → 2D输出(最常用:向量场)

比如你的函数F(v)接受一个2×1或1×2的NumPy矩阵v=[x,y],输出另一个2D向量[f(x,y), g(x,y)]。这种情况最适合画向量场(Quiver Plot)——在平面的每个网格点上,用箭头表示该点的输出向量方向和大小。

具体步骤&代码示例

import numpy as np
import matplotlib.pyplot as plt

# 定义你的向量函数(接受NumPy矩阵输入)
def F(v):
    # 兼容2×1或1×2的矩阵输入
    x = v[0, 0] if v.shape == (2,1) else v[0, 0]
    y = v[1, 0] if v.shape == (2,1) else v[0, 1]
    # 示例:复平面平方映射的向量函数
    fx = x**2 - y**2
    fy = 2 * x * y
    # 返回同样是NumPy矩阵
    return np.matrix([[fx], [fy]])

# 1. 生成平面网格点
x_range = np.linspace(-2, 2, 20)  # x轴取值范围
y_range = np.linspace(-2, 2, 20)  # y轴取值范围
X, Y = np.meshgrid(x_range, y_range)  # 生成网格矩阵

# 2. 把网格点转换成函数接受的矩阵格式
# 先把X、Y展平,再逐个组合成2×1的矩阵
grid_vectors = np.array([np.matrix([[xi], [yi]]) for xi, yi in zip(X.flatten(), Y.flatten())])

# 3. 计算每个网格点的输出向量
output_vectors = np.array([F(v) for v in grid_vectors])
# 提取fx和fy,重新整理成网格形状
FX = output_vectors[:, 0, 0].reshape(X.shape)
FY = output_vectors[:, 1, 0].reshape(Y.shape)

# 4. 绘制向量场
plt.figure(figsize=(8,8))
plt.quiver(X, Y, FX, FY, color='#1f77b4', scale=20, alpha=0.7)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Vector Field of $F(v) = [x^2 - y^2, 2xy]$')
plt.grid(True)
plt.show()

优化:向量化计算(更快)

如果你的函数可以直接处理NumPy数组(而不是单个矩阵),可以避免循环,大幅提升速度:

# 向量化版本的函数,直接接受X、Y网格数组
def F_vectorized(X, Y):
    fx = X**2 - Y**2
    fy = 2 * X * Y
    return fx, fy

# 直接计算,无需循环
FX, FY = F_vectorized(X, Y)
# 后续绘图代码和上面一致

场景2:2D输入 → 1D输出(标量函数,你已经熟悉)

这种情况就是普通的多变量标量函数,比如f(v)=x²+y²,可以画3D曲面图或等高线图:

# 定义标量函数(接受2D矩阵输入)
def f(v):
    x = v[0,0]
    y = v[1,0]
    return x**2 + y**2

# 计算每个网格点的标量值
Z = np.array([f(np.matrix([[xi],[yi]])) for xi, yi in zip(X.flatten(), Y.flatten())]).reshape(X.shape)

# 绘制3D曲面图
fig = plt.figure(figsize=(10,7))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
plt.xlabel('x')
plt.ylabel('y')
plt.title('3D Surface of $f(v) = x^2 + y^2$')
plt.show()

# 或者绘制等高线图
plt.figure(figsize=(8,8))
contour = plt.contour(X, Y, Z, levels=10, cmap='viridis')
plt.clabel(contour, inline=True, fontsize=10)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Contour Plot of $f(v) = x^2 + y^2$')
plt.grid(True)
plt.show()

场景3:1D输入 → nD输出(空间曲线)

比如输入是标量t(用1×1的NumPy矩阵表示),输出是3D向量[cos(t), sin(t), t],这种情况可以画空间曲线:

# 定义向量函数(接受1×1矩阵输入)
def r(t):
    t_val = t[0,0]
    return np.matrix([[np.cos(t_val)], [np.sin(t_val)], [t_val]])

# 生成输入参数t的取值
t_range = np.linspace(0, 10*np.pi, 1000)
# 计算每个t对应的输出向量
curve_points = np.array([r(np.matrix([[ti]])) for ti in t_range])
# 提取x、y、z分量
x = curve_points[:,0,0]
y = curve_points[:,1,0]
z = curve_points[:,2,0]

# 绘制3D空间曲线
fig = plt.figure(figsize=(10,7))
ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z, color='#ff7f0e', linewidth=2)
plt.xlabel('x')
plt.ylabel('y')
plt.zlabel('z')
plt.title('3D Helix Curve of $r(t) = [cos(t), sin(t), t]$')
plt.show()

关键总结

  • 匹配输入输出维度选择可视化方式:
    • 2D→2D:向量场(quiver)
    • 2D→1D:3D曲面/等高线
    • 1D→nD:平面/空间曲线
  • 如果你的函数必须接受NumPy矩阵,记得处理好维度(比如2×1 vs 1×2);如果可以改成向量化函数,效率会高很多。

内容的提问来源于stack exchange,提问作者Frank Vel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:10:51