0

我在 3d 空间中有以下一组点,我想计算各处的梯度,即返回一个向量场。

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

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

4

1 回答 1

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函数感兴趣,它给出了沿给定轴的离散差异。

于 2012-08-22T22:40:57.047 回答