use*_*956 6 python matlab matplotlib
我正在尝试创建一个matplotlib脚本,它将打印由MATLAB脚本生成的相当相同的箭头图.
对不起,我不能张贴图片因为我没有足够的特权,但基本上我的python脚本给了我完全不同的情节(完全错误的矢量方向).
我在运行时比较了MATLAB和python之间的数据.X,Y,Z是相同的但是梯度没有正确计算,即U在python中与DXMATLAB中的不同.为什么会这样?
MATLAB
%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
Run Code Online (Sandbox Code Playgroud)
蟒蛇
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()
Run Code Online (Sandbox Code Playgroud)
简而言之:您将其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()
Run Code Online (Sandbox Code Playgroud)
这会产生箭头指向错误方向的结果:

如果我们交换周围的东西,我们将得到正确的结果:
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()
Run Code Online (Sandbox Code Playgroud)

您也可以考虑使用numpy.mgrid,因为它更短且一致性. numpy.meshgrid默认情况下交换东西(返回x,y而不是y,x)用于2D情况,这使得其行为与其他所有内容不一致.(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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3917 次 |
| 最近记录: |