我想问如何从网格生成相应的值。我有一个函数"foo“,它接受一个长度为2的一维数组,并返回一些实数。
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我用网格生成X和Y网格。
然后,如何使用"foo“函数生成相应的Z值,以便在3D中绘制它们,例如用X、Y、Z值绘制plot_surface函数?
这里的问题是如何使用"foo“函数生成与X和Y具有相同形状的Z值。因为我的"foo“函数只使用一维数组,所以我不知道如何使用这个函数与X和Y一起生成相应的Z值。
发布于 2016-09-27 00:59:38
使用np.dstack将两个numpy数组叠成“深度”,然后修改foo函数,使其只在叠加数组的最后一个轴上操作。这很容易使用参数np.sum和参数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,它应该完全满足您的需要:
>>> 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]])https://stackoverflow.com/questions/39714176
复制相似问题