所以我知道(数学)函数的梯度是什么,所以我觉得我应该知道numpy.gradient
的作用。但我不是。 documentation也没有用处:
返回N维数组的渐变。
数组的渐变是多少? numpy.gradient
何时有用?
答案 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)
因此,计算上面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)...
我们可以做得更好吗?确实是的。如果我们假设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 = 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)
答案 3 :(得分:1)
将N维数组视为矩阵。 然后梯度就是矩阵区分
要获得一个很好的解释,请查看matlab文档中的gradient描述。