我正在使用 numpy 1.6 和 matplotlib 1.1.1,试图从我拥有的标量场生成速度场。到目前为止,我正在生成我的标量数据:
num_samples = 50
dim_x = np.linspace(self.min_x, self.max_x,num_samples)
dim_y = np.linspace(self.min_y, self.max_y,num_samples)
X, Y = np.meshgrid(dim_x, dim_y)
len_x = len(dim_x)
len_y = len(dim_y)
a = np.zeros([len_x, len_y], dtype=float)
for i, y in enumerate(dim_y):
for j, x in enumerate(dim_x):
a[i][j] = x*y # not exactly my function, just an example
然后我得到渐变:
(velx,vely) = np.gradient(a)
在 numpy 文档中,velx 是向量场的 x 分量,vely 是向量场的 y 分量。检查 matplotlib 的文档,我使用 quiver 使用箭头绘制矢量场。它指出 velx 和 vely 是向量场的 x 分量和 y 分量:
fig0 = plt.figure()
ax = fig0.add_subplot(111)
Q = ax.quiver(X,Y, velx, vely )
plt.show()
这给出了速度场的错误结果:
图表看起来不错的唯一方法是,如果我在 quiver 上反转组件:
Q = ax.quiver(X,Y, vely, velx )#WHY???
我怀疑这类似于行或列排序,但我无法弄清楚 np.gradient 的输出是否反转,或者 quiver 是否反转。所有一维问题都按预期工作。谢谢!
编辑:为了更清楚这是如何反转的,更改函数
a[i][j] = x*y
到
a[i][j] = x*x
梯度应该在 x 方向,随着 x 的增加而增加。结果仍然是错误的:如果我使用
Q = ax.quiver(X,Y, velx, vely )
我明白了
如果我把它倒过来
Q = ax.quiver(X,Y, vely, velx )
我明白了
也许有一个更蟒蛇(和正确!)的方式来做到这一点......