如何演示给定二维函数的 numpy 梯度使用情况?

How to demonstrate numpy gradient usage with a given 2-d function?

提问人:Coneain 提问时间:9/22/2023 最后编辑:Coneain 更新时间:9/22/2023 访问量:46

问:

我对 N-D 数组上的 numpy 梯度使用感到非常困惑。我编写了一些代码片段来理解它在一维数组上的用法,如下所示:

import numpy as np
import matplotlib.pyplot as plt

# 1-d
t = np.linspace(0, 0.04, 101)
w = 2*np.pi*50
y = np.sin(w*t)

dy = w * np.cos(w*t)
dy_numeric = np.gradient(y, 0.0004, edge_order=1)

plt.plot(t, y, label='f')
plt.plot(t, dy, label='df')
plt.plot(t, dy_numeric, label='df_num')
plt.legend()
plt.show()

上面的示例显示了它的工作原理及其内部关系。但是我不能对给定的二维函数执行相同的操作,如下所示:

x = np.linspace(-10, 10, 201)
y = np.linspace(-10, 10, 201)
f = x ** 2  + y ** 2
df_dx = 2 * x
df_dy = 2 * y

# the exact gradient expression of this 2-d function is [2*x, 2*y]
# but how can I use np.gradient to compute its numeric values?
# df_vals = np.gradient(?,?) 
python numpy 数学

评论


答:

2赞 Luca 9/22/2023 #1

2D 片段的问题在于它根本不是 2D。如果你尝试,你会得到.fprint(f.shape)(201,)

您可以尝试以下操作来获取沿 X 和 Y 方向的梯度数值。

# 2-d
x = np.linspace(-10, 10, 201)
y = np.linspace(-10, 10, 201)

def func(x, y):
    return x**2 + y**2
f = func(x[:, None], y[None, :])

df_dx = 2 * x
df_dy = 2 * y
df_dx_numeric, df_dy_numeric = np.gradient(f, 0.0004, edge_order=1)

正如您可以测试的那样,现在符合预期。f.shape(201,201)

评论

0赞 Coneain 9/25/2023
美妙!正是我想要的!谢谢。