关于np.gradient()二维数组计算的疑问:2x2元素为何是1.7?
关于np.gradient()二维数组非均匀梯度计算的疑问解答
先看你的示例代码:
dx = 2. y = [1., 1.5, 3.5] np.gradient(np.array([[1, 2, 6], [3, 4, 5]], dtype=float), dx, y)
运行结果:
[array([[ 1. , 1. , -0.5], [ 1. , 1. , -0.5]]), array([[2. , 2. , 2. ], [2. , 1.7, 0.5]])]
你疑惑的第二数组中索引(1,1)的元素(值1.7),问题出在你用了错误的计算方式——直接取两端点的斜率(5-3)/(3.5-1),但np.gradient对非均匀间隔的中间点,采用的是加权中心差分公式,而非简单的两点差分。
具体计算过程
针对第二行(索引1)的中间元素(值为4),列方向的采样坐标是y = [1., 1.5, 3.5],对应三个点:
- 左点:x₀=1.0,对应数组值3
- 当前点:x₁=1.5,对应数组值4
- 右点:x₂=3.5,对应数组值5
先计算左右间隔:
- 左间隔:hₗ = x₁ - x₀ = 0.5
- 右间隔:hᵣ = x₂ - x₁ = 2.0
np.gradient对非均匀中间点的梯度计算公式为:
gradient = [( (y₂ - y₁)/hᵣ ) * hₗ + ( (y₁ - y₀)/hₗ ) * hᵣ ] / (hₗ + hᵣ)
代入数值计算:
- 右差分加权:
(5-4)/2 * 0.5 = 0.5 * 0.5 = 0.25 - 左差分加权:
(4-3)/0.5 * 2 = 2 * 2 = 4.0 - 加权和:
0.25 + 4.0 = 4.25 - 除以总间隔:
4.25 / (0.5 + 2.0) = 4.25 / 2.5 = 1.7
这就是结果中1.7的由来。
内容的提问来源于stack exchange,提问作者prananna
相关产品推荐
相关产品推荐

