绘制numpy向量的函数

时间:2018-02-13 20:34:32

标签: python numpy matplotlib 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),但我不知道如何将它扩展到我的vector函数。那怎么能实现呢?

2 个答案:

答案 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()

enter image description here

但是,为了从问题中获得所需的输出,函数取决于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()

enter image description here

答案 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)