我有一个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)
python - 生成2D阵列的梯度图-LMLPHP

使用下面@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()

我得到的图像:
python - 生成2D阵列的梯度图-LMLPHP

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

这是我的图像。左侧:初始2D map 的图像。右图:渐变图的图像。 @Mad Physicist您是否认为它们与上面相似,只是颜色不同?

python - 生成2D阵列的梯度图-LMLPHP python - 生成2D阵列的梯度图-LMLPHP

最佳答案

如果您正在寻找梯度的大小,则可以

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

关于python - 生成2D阵列的梯度图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34003993/

10-16 03:12