我使用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分量,and是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的输出是颠倒的。所有一维问题都像预期的那样工作。谢谢!
EDIT:为了更清楚这是如何反转的,请更改函数
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 )我得到了

也许有更多的蟒蛇(而且是正确的!)干得好……
发布于 2012-08-17 03:10:17
我想你是对的(这是一个数组排序问题)。a是作为a[yidx,xidx]构建的,但是当你使用渐变时,你需要:velx, vely = np.gradient(a),而你应该使用vely, velx = np.gradient(a)。因为沿0轴的梯度应该是vely (假设是d/dy(a) = vely)?--除非我遗漏了什么(在这种情况下,我会很高兴地删除这个答案)。
另请注意,我认为您可以在没有嵌套列表的情况下构建"a“:
a = X*Y这应该也适用于更复杂的函数。
https://stackoverflow.com/questions/11993790
复制相似问题