numpy.gradient做什么?

usu*_* me 25 python math numpy

所以我知道(数学)函数的梯度是什么,所以我觉得我应该知道它是什么numpy.gradient.但我没有.该文件是不是真的有用之一:

返回N维数组的渐变.

数组的梯度是多少?什么时候numpy.gradient有用?

SiH*_*iHa 70

另外在文档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. ])
Run Code Online (Sandbox Code Playgroud)
  • 梯度定义为(改变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
Run Code Online (Sandbox Code Playgroud)

例如,您可以在结果数组中找到所有绝对值的最小值,以查找曲线的转折点.


1实际上x在文档的示例中调用了数组,我已将其更改y为避免混淆.

  • 很棒的答案。真的帮助我尝试用 C++ 编写这个函数。 (3认同)
  • @AlaaM。在文档中,间距为“2”的示例中,值只是未指定间距的结果的一半。所以看起来这意味着间距是名义上的 x 轴上每个点之间的距离,而不是默认的“1”。所以数组将具有相同的大小。 (3认同)
  • 有人可以解释为什么无论间距参数如何,返回的数组都具有与输入数组相同的大小吗?我希望它能更小,间距更大 (2认同)

Rob*_*PhD 15

这是发生了什么。给定接近点的值,泰勒级数展开式指导我们如何近似导数。最简单的来自 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(xh) = 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(xh)]/(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])
Run Code Online (Sandbox Code Playgroud)

你说的是 f(0) = 5, f(1) = 7, f(2) = 4, and f(3) = 8。然后

np.gradient(f) 
Run Code Online (Sandbox Code Playgroud)

将是: 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)
Run Code Online (Sandbox Code Playgroud)

这就是说 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]))
Run Code Online (Sandbox Code Playgroud)

最后,如果您的输入是一个二维数组,那么您正在考虑在网格上定义的 x, y 函数 f。numpy 梯度将输出 x 和 y 中“离散化”偏导数的数组。

  • 我创建了一个解释视频... https://www.youtube.com/watch?v=NvP7iZhXqJQ (2认同)

4pi*_*ie0 9

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

默认距离为1

意味着在内部计算为

在此输入图像描述

其中h = 1.0

在边界

在此输入图像描述

  • 我在深色模式主题中看不到你的公式。 (6认同)
  • 您确定* h = 1 *吗?因为这意味着它是* f(x + 0.5)-f(x-0.5)*,所以如果x = 2,则如果* f *是1,则它变成* f(2.5)-f(1.5)*。 d数组不能有非整数x。看起来实际上是* f(x + 1)-f(x-1)*。 (2认同)