使用numpy.gradient进行非均匀间距计算

6

我不确定在使用numpy.gradient时如何指定非均匀间距。

这里是y = x ** 2的示例代码。

import numpy as np
import matplotlib.pyplot as plt

x = [0.0, 2.0, 4.0, 8.0, 16.0]
y = [0.0, 4.0, 16.0, 64.0, 256.0]
dydx = [0.0, 4.0, 8.0, 16.0, 32.0] # analytical solution

spacing = [0.0, 2.0, 2.0, 4.0, 8.0] #added a zero at the start to get length matching up with y

m = np.gradient(y, spacing)

plt.plot(x, y, 'bo',
         x, dydx, 'r-', #analytical solution
         x, m, 'ro')    #calculated solution
plt.show()

间距数组的长度始终比我想要计算梯度的数组少一个。添加一个零以使长度匹配(如上面的示例代码中所示)会得到不正确的答案,其中一点的梯度为无穷大。
我无法理解/遵循numpy.gradient文档中非均匀间距的说明(https://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html
我应该如何指定点之间的间距?还有其他方法吗?
Numpy版本为1.9.2
1个回答

7
该函数的 API 有些令人困惑。对于非均匀采样点,梯度函数 接受 点的坐标 而不是间距:

varargs:标量或数组的列表,可选项

f 值之间的间距。所有维度的默认单位间距为 1。可以使用以下方式指定间距:

  1. 单个标量以指定所有维度的采样距离。
  2. N 个标量以指定每个维度的常量采样距离,例如 dx、dy、dz 等。
  3. N 个数组以指定 F 沿每个维度的值的 坐标。数组的长度必须与相应维度的大小相同。
  4. 任何组合的 N 标量/数组具有 2 和 3 的意义。

我稍微修改了您的示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(10)
x.sort()
y = x**2
dydx = 2*x

dydx_grad = np.gradient(y, x)

plt.plot(x, dydx, 'k-', label='analytical solution')
plt.plot(x, dydx_grad, 'ro', label='calculated solution')
plt.legend(); plt.xlabel('x'); plt.ylabel('dy / dx'); plt.show(); 

即使我增加了点数,它仍然给出了不正确的梯度。我在想这是否是我的问题。我无法得到与numpy.gradient文档相同的答案,也无法按照他们的示例进行操作。当我输入相同的f和x值时,我得到的不是他们的非均匀间距答案[1.,3.,3.5,6.7,6.9,2.5],而是[inf,1.5,1.67,1.,1.125,0.83]。我会继续尝试并看看能否解决这个问题。谢谢。 - Aaron
1
我的numpy版本已经过时了。其他人也遇到了类似的问题(https://dev59.com/LqTja4cB1Zd3GeqPCXov)。我更新了它,现在它可以正常工作了。在Windows上,这是通过pip install --upgrade numpy来完成的。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接