所以我知道(数学)函数的梯度是什么,所以我觉得我应该知道 numpy.gradient是做什么的。但我没有。文件也没什么帮助:
numpy.gradient
返回 N 维数组的梯度。
数组的渐变是什么? 什么时候 numpy.gradient有用?
也在文件中:
>>> y = np.array([1, 2, 4, 7, 11, 16], dtype=np.float) >>> j = np.gradient(y) >>> j array([ 1. , 1.5, 2.5, 3.5, 4.5, 5. ])
梯度定义为(y的变化)/(x的变化)。
y
x
这里的 x是列表索引,因此相邻值之间的差为1。
在边界处,计算第一个差。这意味着在数组的每一端,给出的梯度是简单的,即两端值之间的差(除以1)
在边界之外,特定索引的梯度是通过取两边值之间的差除以2得到的。
因此,上面的 y的梯度是这样计算的:
j[0] = (y[1]-y[0])/1 = (2-1)/1 = 1 j[1] = (y[2]-y[0])/2 = (4-1)/2 = 1.5 j[2] = (y[3]-y[1])/2 = (7-2)/2 = 2.5 j[3] = (y[4]-y[2])/2 = (11-4)/2 = 3.5 j[4] = (y[5]-y[3])/2 = (16-7)/2 = 4.5 j[5] = (y[5]-y[4])/1 = (16-11)/1 = 5
例如,您可以找到结果数组中所有绝对值的最小值,以找到曲线的转折点。
1 在文档的示例中,这个数组实际上被称为 x,为了避免混淆,我将其更改为 y。
把 N 维数组想象成一个矩阵。 那么梯度就是矩阵微分
有关详细说明,请参阅 matlab 文档中的 渐变描述。
梯度是使用内部的中心差和 最初的分歧在边界上。
还有
默认距离为1
这个 手段在内部被计算为
其中 h = 1.0
在边界
事情是这样的。泰勒级数展开式指导我们如何近似导数,给定在接近点的值。最简单的来自 C ^ 2函数(两个连续导数)的一阶泰勒级数展开式..。
可以求 f’(x) ..。
我们能做得更好吗? 是的,确实如此。如果我们假设 C ^ 3,那么泰勒展开是
减去这些(h ^ 0和 h ^ 2项都不算!) ,求出 f’(x) :
所以,如果我们有一个定义在等距离分区上的离散函数: X = x _ 0,x _ 0 + h (= x _ 1) ,... ... ,x _ n = x _ 0 + h * n,那么 numpy 梯度将产生一个“导数”数组,使用两端的一阶估计和中间较好的估计。
例1. 如果没有指定任何间距,则假定间隔为1
f = np.array([5, 7, 4, 8])
你的意思是 f (0) = 5,f (1) = 7,f (2) = 4,f (3) = 8
np.gradient(f)
将是: f’(0) = (7-5)/1 = 2,f’(1) = (4-5)/(2 * 1) = -0.5,f’(2) = (8-7)/(2 * 1) = 0.5,f’(3) = (8-4)/1 = 4。
示例2. 如果指定单个间距,则间距是均匀的,但不是1。
例如,如果您调用
np.gradient(f, 0.5)
这意味着 h = 0.5,而不是1,也就是说,函数实际上是 f (0) = 5,f (0.5) = 7,f (1.0) = 4,f (1.5) = 8。最终的结果是用 h = 0.5代替 h = 1,所有的结果都会翻倍。
例子3。假设离散化函数 f (x)不是定义在均匀间隔的区间上,例如 f (0) = 5,f (1) = 7,f (3) = 4,f (3.5) = 8,那么有一个更混乱的离散化微分函数,数字梯度函数使用,你将通过调用
np.gradient(f, np.array([0,1,3,3.5]))
最后,如果您的输入是一个2d 数组,那么您将考虑一个在网格上定义的 x,y 的函数 f。数字梯度将输出 x 和 y 中“离散化”的偏导数阵列。