我有一个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()
Run Code Online (Sandbox Code Playgroud)
我想基本上从第一张图片中得到第二张图片.第二幅图像描述为? = \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()
Run Code Online (Sandbox Code Playgroud)
我从对等式的基本理解中解释了这个错误?
所以这是我的图像.左侧:初始2D地图的图像.右:梯度图的图像.@Mad物理学家你认为他们与上面的相似只有不同的颜色?
如果您正在寻找梯度的大小,您可以这样做
mag = np.sqrt(vgrad[0]**2 + vgrad[1]**2)
Run Code Online (Sandbox Code Playgroud)
然后绘制mag而不是xgrad如上所述。如果要将梯度绘制为矢量图或流图,请执行以下操作
plt.streamplot(xi, yi, vgrad[0], vgrad[1])
Run Code Online (Sandbox Code Playgroud)
您可能还对斜率的可视化表示感兴趣,它可以通过在 3D 中绘制原始曲面来获得:
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xi, yi, varray)
plt.show()
Run Code Online (Sandbox Code Playgroud)
请参阅matplotlib 中 Matlab's surf(x,y,z,c) 的等效项是什么?和http://matplotlib.org/examples/mplot3d/surface3d_demo.html