我想绘制一个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)
,但我不知道如何将它扩展到我的vector函数。那怎么能实现呢?
答案 0 :(得分:1)
假设X.T @ X
的含义是numpy.dot(X.T,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()
答案 1 :(得分:1)
这里的问题是安排尺寸。你的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)