我有一个2D数组,它存储每个点的属性值作为其元素:f(x,y) = f[x][y]
。现在我想找到这个数组的渐变。我查看np.gradient
,但它只返回两个数组,首先是x方向的导数,y方向的第二个。
我想了解如何使用此方法或任何其他方式创建显示2D数组渐变变化的渐变映射。
varray
是我想要创建渐变映射的2D数组。以下是我现在唯一能想到的事情。我知道应该有一种聪明的方式来使用由x gradient
生成的y gradient
和np.gradient()
,但我无法想到它。
lx
和ly
是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()
我从对等式的基本理解中解释了这个错误?
所以这是我的照片。左侧:初始2D地图的图像。右:梯度图的图像。 @Mad Physicist你觉得它们与上面的相似而只有颜色的不同吗?
答案 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