生成2D数组的梯度图

时间:2015-11-30 17:04:40

标签: python numpy

我有一个2D数组,它存储每个点的属性值作为其元素:f(x,y) = f[x][y]。现在我想找到这个数组的渐变。我查看np.gradient,但它只返回两个数组,首先是x方向的导数,y方向的第二个。

我想了解如何使用此方法或任何其他方式创建显示2D数组渐变变化的渐变映射。
varray是我想要创建渐变映射的2D数组。以下是我现在唯一能想到的事情。我知道应该有一种聪明的方式来使用由x gradient生成的y gradientnp.gradient(),但我无法想到它。 lxly是2D数组的x和y维度。

vgrad = np.gradient(varray)
xgrad = vgrad[0]
x, y = range(0, lx), range(0,ly)
xi, yi = np.meshgrid(x, y)
rbf = scipy.interpolate.Rbf(xi, yi, xgrad)
plt.imshow(v, vmin = np.amin(xgrad), vmax=np.amax(xgrad))
plt.colorbar()
plt.show()  

我想基本上从第一张图片中获得第二张图片。第二个图像被描述为σ = \alpha*grad(varray)

使用下面@Mad Physicist建议的渐变幅度。

vgrad = np.gradient(varray)
fulgrad = np.sqrt(vgrad[0]**2 + vgrad[1]**2)
plt.imshow(fulgrad,cmap=plt.get_cmap('hot'), vmin = np.amin(fulgrad),vmax = np.amax(fulgrad))  
plt.colorbar()
plt.show()  

我得到的图像: enter image description here

我从对等式的基本理解中解释了这个错误?

所以这是我的照片。左侧:初始2D地图的图像。右:梯度图的图像。 @Mad Physicist你觉得它们与上面的相似而只有颜色的不同吗?

enter image description here enter image description here

1 个答案:

答案 0 :(得分:4)

如果您正在寻找渐变的幅度,您可以这样做

mag = np.sqrt(vgrad[0]**2 + vgrad[1]**2)

然后如上所述绘制mag而不是xgrad。如果您想将渐变绘制为矢量地图或流图,请执行类似

的操作
plt.streamplot(xi, yi, vgrad[0], vgrad[1])

您可能也对斜坡的直观表示感兴趣,只需在3D中绘制原始曲面即可获得:

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xi, yi, varray)
plt.show()

请参阅What is the equivalent of Matlab's surf(x,y,z,c) in matplotlib?http://matplotlib.org/examples/mplot3d/surface3d_demo.html