[英]Plotting a function of numpy vector
我想绘制一个numpy矩阵的函数
f = lambda X: X.T @ X
但我不确定如何进行。 我对多变量函数的方法很熟悉,与多变量函数(以及绘图)的等效函数将是
g = lambda x, y: x**2 + y**2
X, Y = np.meshgrid(
np.linspace(start = -10, stop = 10, num = 101),
np.linspace(start = -10, stop = 10, num = 101))
plt.plot_surface(X,Y,g(X,Y))
所以f(np.matrix((x,y))) == g(x,y)
,但是我不知道如何将其扩展到我的向量函数中。 那么如何实现呢?
假设XT @ X
含义是numpy.dot(XT,X)
,您可以像绘制其他任何函数一样直接绘制结果。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
f = lambda X: np.dot(X.T,X)
fig = plt.figure()
ax = plt.subplot(projection="3d")
X, Y = np.meshgrid(
np.linspace(start = -10, stop = 10, num = 101),
np.linspace(start = -10, stop = 10, num = 101))
ax.plot_surface(X,Y,f(X))
plt.show()
但是,为了从问题中获得所需的输出,该函数同时取决于x和y,因此可能需要的是
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
f = lambda xi,yi: np.dot(np.dot([xi,yi],np.identity(2)),[[xi],[yi]])
fig = plt.figure()
ax = plt.subplot(projection="3d")
X, Y = np.meshgrid(
np.linspace(start = -10, stop = 10, num = 101),
np.linspace(start = -10, stop = 10, num = 101))
Z = np.vectorize(f)(X,Y)
ax.plot_surface(X,Y,Z)
plt.show()
这里的问题是安排尺寸。 您的f似乎期望X和Y被转换为向量的集合。 但是X和Y是两个101x101矩阵。 因此,需要进行一些重新排列和按摩。 好消息是,使用下面的map
命令可以对任何功能进行操作。 坏消息-效率是优雅可能不是最佳的。
这是我会尝试的:
Z = map(f, np.array([X.ravel(), Y.ravel()]).T)
Z = np.array(list(Z)).reshape(X.shape)
接着
ax.plot_surface(X,Y,Z)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.