Python 从网格网格数据(Numpy)生成数据

Python 从网格网格数据(Numpy)生成数据,python,numpy,matplotlib,Python,Numpy,Matplotlib,我想问一下如何从网格生成相应的值。我有一个函数“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

我想问一下如何从网格生成相应的值。我有一个函数“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值,以便在三维中绘制它们,例如,使用具有X、Y、Z值的plot_曲面函数进行绘制


这里的问题是如何使用“foo”函数生成与X和Y形状相同的Z值。由于我的“foo”函数只接受1D数组,我不知道如何将此函数与X和Y一起使用以生成相应的Z值。

使用“深度”将两个numpy数组堆叠,然后修改
foo
函数,使其仅在堆叠数组的最后一个轴上运行。使用参数
axis=-1
,而不是使用内置的
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.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]])

您是否希望网格中的每个点
(x,y)
都使用
z=foo([x,y])
?感谢您提供的精彩解决方案。这正是我想做的。然而,我在将这种方法应用于代码块时遇到了一些问题。我实际上发布了另一个关于这件事的问题。我实际的foo函数实际上类似于
返回X[0]+X[1],因此它不能对嵌套数组执行迭代操作,只能采用(2,)的形式。因此,如果我将XY放入实际的foo函数中,它会抛出我们的错误。在这种情况下,如何才能像您那样生成Z?哦,对不起,我忘了!顺便问一下,如果我只想使用我当前的foo函数,它只能采用(2,)的形状,你能告诉我应该如何更改你的ode吗?@AnnDescomp我已经发布了关于你另一个问题的答案。看看这对你是否有效…我现在正在看“…”索引。此外,我想知道是否有一种方法可以使用当前的foo函数生成Z,该函数只能显式地将一(2,)个shapenumpy数组作为参数。