numpy.gradient 的非均匀间距

Aar*_*ron 5 python numpy derivative differentiation

我不确定在使用 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()
Run Code Online (Sandbox Code Playgroud)

间距数组的长度总是比我想计算梯度的数组少一。添加零以使长度匹配(如在上面的示例代码中)给出了错误的答案,一个点的梯度是无限的。

我无法理解/遵循非均匀间距的 numpy.gradient 文档(https://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html

我应该如何指定点之间的间距?有没有其他方法可以做到这一点?

Numpy 版本 1.9.2

xdz*_*ze2 8

该函数的API相当混乱。对于非均匀间隔的样本点,梯度函数采用点的坐标而不是间距:

\n\n
\n

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

\n\n

f 值之间的间距。所有尺寸的默认统一间距。可以使用以下方式指定间距:

\n\n
    \n
  1. 单个标量指定所有维度的样本距离。
  2. \n
  3. N 个标量,用于指定每个维度的恒定样本距离。即 dx、dy、dz、\xe2\x80\xa6
  4. \n
  5. N 个数组,用于指定F 的每个维度上的值的坐标。数组的长度必须与相应维度的大小匹配
  6. \n
  7. 具有 2. 和 3. 含义的 N 个标量/数组的任意组合。
  8. \n
\n
\n\n

我稍微修改了你的例子:

\n\n
import numpy as np\nimport matplotlib.pyplot as plt\n\nx = np.random.rand(10)\nx.sort()\ny = x**2\ndydx = 2*x\n\ndydx_grad = np.gradient(y, x)\n\nplt.plot(x, dydx, \'k-\', label=\'analytical solution\')\nplt.plot(x, dydx_grad, \'ro\', label=\'calculated solution\')\nplt.legend(); plt.xlabel(\'x\'); plt.ylabel(\'dy / dx\'); plt.show(); \n
Run Code Online (Sandbox Code Playgroud)\n