2D箭头图 - matplotlib和MATLAB的输出不匹配

6
我正在尝试创建一个matplotlib脚本,它将打印与MATLAB脚本产生的相当相似的quiver图。
很抱歉,我无法发布图片,因为我没有足够的权限,但基本上我的python脚本给了我完全不同的图(向量方向完全错误)。
我在运行时比较了MATLAB和python之间的数据。X、Y、Z是相同的,但是梯度并没有正确计算,即python中的U与MATLAB中的DX不同。这是为什么呢?
%2D quiver
[X,Y] = meshgrid(-2:.2:2);
Z = X.*exp(-X.^2 - Y.^2);
[DX,DY] = gradient(Z,.2,.2);
contour(X,Y,Z)
hold on
quiver(X,Y,DX,DY)
%colormap hsv
grid off
hold off

Python
from pylab import *
from numpy import ma
import numpy as np
import matplotlib.pyplot as plt

X,Y = np.meshgrid( np.linspace(-2,2,21),np.linspace(-2,2,21))
Z=X*np.exp(-X*X-Y*Y)

[U,V]=gradient(Z,.2,.2)

print U

figure()
Q = quiver(X,Y,U,V)
show()

1
numpy.gradient 基本上会返回 dy, dx。你把它当作返回 dx, dy 来处理了。Numpy 的索引是行、列。因此,np.gradient 实际上返回的是 dy, dx 而不是 dx, dy - Joe Kington
1个回答

6
简而言之:您将 numpy.gradient 视为使用“列”,“行”索引。它返回 dy,dx,而您期望的是 dx,dy
首先,除非在交互式使用它,否则做from pylab import * 是一个非常糟糕的想法。 命名空间是您的朋友。
考虑到这一点,您当前的示例如下所示:
import numpy as np
import matplotlib.pyplot as plt

x, y = np.meshgrid(np.linspace(-2,2,21), np.linspace(-2,2,21))
z = x * np.exp(-x**2 - y**2)

u, v = np.gradient(z, .2, .2)

fig, ax = plt.subplots()
ax.quiver(x, y, u, v)
plt.show()

箭头指向错误的结果如下:

enter image description here

如果我们互换一下,就能得到正确的结果:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.meshgrid(np.linspace(-2,2,21), np.linspace(-2,2,21))
z = x * np.exp(-x**2 - y**2)

v, u = np.gradient(z, .2, .2)

fig, ax = plt.subplots()
ax.quiver(x, y, u, v)
plt.show()

图片描述

你还可以考虑使用numpy.mgrid,因为它更短且更加一致。对于二维情况,默认情况下numpy.meshgrid会交换x和y的返回结果(返回x,y而不是y,x),这使得其行为与其他所有东西都不一致(np.meshgrid(..., indexing='ij')可以解决这个问题,但默认行为有点令人困惑)。

以下是一个示例:

import numpy as np
import matplotlib.pyplot as plt

y, x = np.mgrid[-2:2:21j, -2:2:21j]
z = x * np.exp(-x**2 - y**2)

v, u = np.gradient(z, .2, .2)

fig, ax = plt.subplots()
ax.quiver(x, y, u, v)
plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接