我不确定使用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
答案 0 :(得分:1)
该函数的API非常令人困惑。对于非均匀间隔的采样点,gradient function采用的是该点的坐标而不是间距:
varargs:标量或数组列表,可选
f值之间的间距。所有尺寸的默认单位间距。间距可以使用:
- 单个标量,用于指定所有尺寸的样本距离。
N个标量,用于为每个维度指定恒定的采样距离。即dx,dy,dz,...- N个数组,用于指定沿F的每个维度的值坐标。数组的长度必须与相应维度的大小匹配
- 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();