我正在使用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是vector字段的y组件。检查matplotlib的文档,我使用箭头使用箭头绘制矢量字段。它指出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 )
我得到了
也许有更多的pythonic(并且正确!)方式来做...
答案 0 :(得分:2)
我认为你是对的,(这是一个数组排序问题)。 a
构建为a[yidx,xidx]
但是当你采用渐变时,你应该velx, vely = np.gradient(a)
执行vely, velx = np.gradient(a)
。由于沿第0轴的渐变应该给你vely
(大概是d/dy(a) = vely
)? - 除非我遗漏了某些东西(在这种情况下,我很乐意删除这个答案)。
另请注意,我认为您可以在没有嵌套列表的情况下构建“a
”:
a = X*Y
这应该适用于更复杂的功能......