我想问一下如何从meshgrid生成相应的值。我有一个函数“foo”,它取一个长度为2的1D数组,并返回一些实数。
import numpy as np
def foo(X):
#this function takes a vector, e.g., np.array([2,3]), and returns a real number.
return sum(X)**np.sin( sum(X) );
x = np.arange(-2, 1, 1) # points in the x axis
y = np.arange( 3, 8, 1) # points in the y axis
X, Y = np.meshgrid(x, y) # X, Y : grid
我使用meshgrid生成X和Y网格。
然后,如何使用“foo”函数生成相应的Z值,以便在3D中绘制它们,例如,使用带有X,Y,Z值的plot_surface函数进行绘图?
这里的问题是如何使用“foo”函数生成与X和Y具有相同形状的Z值。由于我的“foo”函数只采用一维数组,我不知道如何使用X和Y这个函数生成相应的Z值。
答案 0 :(得分:2)
使用np.dstack
在“深度”中堆叠两个numpy数组,然后修改foo
函数,使其仅在堆叠数组的最后一个轴上运行。使用参数axis=-1
的{{3}}可以轻松完成此操作,而不是使用内置sum
:
import numpy as np
def foo(xy):
return np.sum(xy, axis=-1) ** np.sin(np.sum(xy, axis=-1))
x = np.arange(-2, 1, 1) # points in the x axis
y = np.arange( 3, 8, 1) # points in the y axis
X, Y = np.meshgrid(x, y) # X, Y : grid
XY = np.dstack((X, Y))
现在,你应该得到:
>>> XY.shape
(5, 3, 2)
>>> foo(XY)
array([[ 1. , 1.87813065, 1.1677002 ],
[ 1.87813065, 1.1677002 , 0.35023496],
[ 1.1677002 , 0.35023496, 0.2136686 ],
[ 0.35023496, 0.2136686 , 0.60613935],
[ 0.2136686 , 0.60613935, 3.59102217]])
如果你想达到同样的效果,但没有修改foo
,那么你可以使用np.sum
,它应该完全符合你的需要:
>>> np.apply_along_axis(foo, -1, XY)
array([[ 1. , 1.87813065, 1.1677002 ],
[ 1.87813065, 1.1677002 , 0.35023496],
[ 1.1677002 , 0.35023496, 0.2136686 ],
[ 0.35023496, 0.2136686 , 0.60613935],
[ 0.2136686 , 0.60613935, 3.59102217]])