numpy.gradient做什么?

时间:2014-07-08 13:51:21

标签: python math numpy

所以我知道(数学)函数的梯度是什么,所以我觉得我应该知道numpy.gradient的作用。但我不是。 documentation也没有用处:

  

返回N维数组的渐变。

数组的渐变是多少? numpy.gradient何时有用?

4 个答案:

答案 0 :(得分:51)

同样在文档 1

>>> 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更改)。
  • 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以避免混淆。

答案 1 :(得分:9)

这是怎么回事。泰勒级数展开式指导我们给出近似值时的近似导数。最简单的是来自C ^ 2函数(两个连续导数)的一阶泰勒级数展开...

  • f(x + h)= f(x)+ f'(x)h + f''(xi)h ^ 2/2。

一个可以解决f'(x)...

  • f'(x)= [f(x + h)-f(x)] / h + O(h)。

我们可以做得更好吗?确实是的。如果我们假设C ^ 3,那么泰勒展开式就是

  • f(x + h)= f(x)+ f'(x)h + f''(x)h ^ 2/2 + f'''(xi)h ^ 3/6,和
  • f(x-h)= f(x)-f'(x)h + f''(x)h ^ 2/2-f'''(xi)h ^ 3/6。

减去这些(h ^ 0和h ^ 2项都掉了!)并求解f'(x):

  • f'(x)= [f(x + h)-f(x-h)] /(2h)+ O(h ^ 2)。

因此,如果我们在等距离的分区上定义了离散函数: 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 = 1替换为h = 0.5,所有结果将加倍。

示例3。假设离散函数f(x)没有在均匀间隔上定义,例如f(0)= 5,f(1)= 7,f(3)= 4,f(3.5)= 8,那么有一个numpy梯度函数使用的更离散离散微分函数,您将通过调用获得离散离散导数

np.gradient(f, np.array([0,1,3,3.5]))

最后,如果您输入的是2d数组,那么您正在考虑在网格上定义的x,y函数f。 numpy渐变将输出x和y中“离散”偏导数的数组。

答案 2 :(得分:8)

  

使用内部和中部的中心差异计算梯度   边界的第一个差异。

  

默认距离为1

这个means在内部计算为

enter image description here

其中h = 1.0

并在边界

enter image description here

答案 3 :(得分:1)

将N维数组视为矩阵。 然后梯度就是矩阵区分

要获得一个很好的解释,请查看matlab文档中的gradient描述。