【问题标题】:Calculating gradient in 3D在 3D 中计算梯度
【发布时间】:2012-08-18 09:49:23
【问题描述】:

我在 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

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

【问题讨论】:

    标签: python numpy gradient


    【解决方案1】:

    您将索引和“点”中的值混合在一起,因此梯度会给您错误的结果。这是用 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 函数感兴趣,它给出了沿给定轴的离散差异。

    【讨论】:

    • 谢谢你的回答,但有些东西我不太明白。首先,如何从一维数组计算梯度?也就是说,np.gradient 是如何知道一个值的旁边是什么以及它的邻居在哪里?根据定义,梯度​​是一个向量场,即六坐标乘以数据点的数量。我看不出这是如何由两个方向的两个数组表示的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2021-09-11
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多