我想计算两个数组a
和b
的数值导数。
如果我这样做
c = diff(a) / diff(b)
我得到了想要的东西,但是我松开了边缘(最后一点),所以c.shape ~= a.shape
。
如果我愿意
c = gradient(a, b)
然后是c.shape = a.shape
,但结果却截然不同。
我已经阅读了如何用numpy计算梯度,我想它做的是完全不同的事情,尽管我还不太清楚区别。但是,有没有一种方法或另一种函数来计算微分,该微分也给出边缘的值?
为什么gradient
和diff
之间的结果如此不同?
答案 0 :(得分:1)
这些功能虽然相关,但执行不同的操作。
np.diff
只是沿给定轴取矩阵切片的差,并用于第n
个差,就沿给定轴返回矩阵,其矩阵要小n
(在n=1
情况)。请参阅:https://docs.scipy.org/doc/numpy/reference/generated/numpy.diff.html
np.gradient
会在保持数组形状https://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html的同时,在数组的所有维度上产生一组渐变,请注意,np.gradient
应该对一个输入数组(第二个参数{ {1}}在这里没有意义(被解释为来自b
的第一个非关键字参数,其目的是描述第一个参数的值之间的间隔),因此结果与您的直觉不符。
如果您确实需要*varargs
与c = diff(a) / diff(b)
匹配,我将只使用c
并将值附加到c.shape
。例如,如果您希望渐变在窗口边缘附近消失,则可以添加零。