从meshgrid数据生成数据(Numpy)

时间:2016-09-27 00:09:56

标签: python numpy matplotlib

我想问一下如何从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值。

1 个答案:

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