我最近一直试图测试numpy.gradient函数。但是,它的行为对我来说有点奇怪。我已经创建了一个包含随机变量的数组,然后在其上应用了numpy.gradient,但这些值似乎很疯狂且无关紧要。但是当使用numpy.diff时,值是正确的。
因此,在查看了numpy.gradient的文档之后,我发现它在所需的维度上使用距离= 1。
这就是我的意思:
import numpy as np;
a= np.array([10, 15, 13, 24, 15, 36, 17, 28, 39]);
np.gradient(a)
"""
Got this: array([ 5. , 1.5, 4.5, 1. , 6. , 1. , -4. , 11. , 11. ])
"""
np.diff(a)
"""
Got this: array([ 5, -2, 11, -9, 21, -19, 11, 11])
"""
我不明白第一个结果的价值是如何产生的。如果默认距离应为1,那么我应该得到与numpy.diff相同的结果。
有人可以解释这里的距离意味着什么。它是相对于数组索引还是数组中的值?如果它取决于值,那么这是否意味着numpy.gradient不能与图像一起使用,因为相邻像素的值没有固定的值差异?
答案 0 :(得分:3)
# load image
img = np.array([[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
[21.0, 20.0, 22.0, 99.0, 18.0, 11.0, 23.0],
[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0],
[21.0, 20.0, 22.0, 24.0, 18.0, 11.0, 23.0]])
print "image =", img
# compute gradient of image
gx, gy = np.gradient(img)
print "gx =", gx
print "gy =", gy
# plotting
plt.close("all")
plt.figure()
plt.suptitle("Image, and it gradient along each axis")
ax = plt.subplot("131")
ax.axis("off")
ax.imshow(img)
ax.set_title("image")
ax = plt.subplot("132")
ax.axis("off")
ax.imshow(gx)
ax.set_title("gx")
ax = plt.subplot("133")
ax.axis("off")
ax.imshow(gy)
ax.set_title("gy")
plt.show()
答案 1 :(得分:0)
内部的中心差异和边界的第一个差异。
15 - 10
13 - 10 / 2
24 - 15 / 2
...
39 - 28
答案 2 :(得分:0)
对于边界点,np.gradient
使用公式
f'(x) = [f(x+h)-f(x)]/h
(左端点),以及
f'(x) = [f(x)-f(x-h)]/h
用于正确的端点。
对于内部点,它使用公式
f'(x) = [f(x+h)-f(x-h)]/2h
第二种方法更准确-O(h ^ 2)vs O(h)。因此,在第二个数据点,np.gradient
估计导数为(13-10)/ 2 = 1.5。
我制作了一段解释数学的视频:https://www.youtube.com/watch?v=NvP7iZhXqJQ