numpy.gradient

时间:2018-08-10 06:20:26

标签: 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()

间距数组的长度总是比我要计算其梯度的数组小一。加一个零以获得匹配的长度(如上面的示例代码中所示)会给出错误的答案,其中一点的梯度是无限的。

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

如何指定点之间的间距?有替代的方法吗?

numpy版本1.9.2

1 个答案:

答案 0 :(得分:1)

该函数的API非常令人困惑。对于非均匀间隔的采样点,gradient function采用的是该点的坐标而不是间距:

  

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

     

f值之间的间距。所有尺寸的默认单位间距。间距可以使用:

     
      
  1. 单个标量,用于指定所有尺寸的样本距离。
  2.   N个标量,用于为每个维度指定恒定的采样距离。即dx,dy,dz,...   
  3. N个数组,用于指定沿F的每个维度的值坐标。数组的长度必须与相应维度的大小匹配
  4.   
  5. N个标量/数组的任意组合,其含义分别为2和3。
  6.   

我稍微修改了您的示例:

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();