在3D中计算梯度

时间:2012-08-22 22:11:03

标签: python numpy gradient

我在3d空间中有以下一组点,D喜欢到处计算渐变,即返回一个矢量场。

points = []
for i in np.linspace(-20,20,100):   
    for j in np.linspace(-20,20,100):
        points.append([i,j,i**2+j**2])
points = np.array(points)

这是一个椭圆形的抛物面。

使用np.gradient(points)http://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html

我既没有得到正确的值,也没有得到我期望的维度。谁能给我一个提示?

1 个答案:

答案 0 :(得分:2)

您正在将“指数”和“点数”中的值混合在一起,因此渐变会给您错误的结果。这是使用numpy构造点并计算渐变的更好方法:

x, y = np.mgrid[-20:20:100j, -20:20:100j]
z = x**2 + y**2
grad = np.gradient(z)

生成的渐变是具有两个阵列的元组,一个用于第一个方向上的渐变,另一个用于第二个方向上的渐变。请注意,此渐变不考虑点之间的分隔(即delta x和delta y),因此要获得导数,需要除以它:

deriv = grad/(40./100.)

如果你想像以前一样重建你的'积分',你只需要这样做:

points = np.array([x.ravel(), y.ravel(), z.ravel()]).T

你可能也对numpy的diff函数感兴趣,它给出了沿给定轴的离散差异。