首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >numpy数组梯度和matplotlib抖动的倒序

numpy数组梯度和matplotlib抖动的倒序
EN

Stack Overflow用户
提问于 2012-08-17 03:04:25
回答 1查看 1.8K关注 0票数 4

我使用numpy 1.6和matplotlib 1.1.1,试图从我拥有的标量场生成一个速度场。到目前为止,我生成的标量数据是这样的:

代码语言:javascript
复制
    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

然后我得到梯度:

代码语言:javascript
复制
   (velx,vely) =  np.gradient(a)

在numpy文档中,velx是向量场的x分量,and是y分量。在检查matplotlib的文档时,我使用quiver使用箭头绘制向量场。它说明velx和vely是向量场的x分量和y分量:

代码语言:javascript
复制
    fig0 = plt.figure()
    ax = fig0.add_subplot(111)
    Q = ax.quiver(X,Y, velx, vely )
    plt.show()

这为速度场提供了错误的结果:

该图唯一看起来正常的方法是,如果我在quiver上反转组件:

代码语言:javascript
复制
    Q = ax.quiver(X,Y, vely, velx )#WHY???

我怀疑这类似于行或列的排序,但我不能确定np.gradient的输出是颠倒的,还是quiver的输出是颠倒的。所有一维问题都像预期的那样工作。谢谢!

EDIT:为了更清楚这是如何反转的,请更改函数

代码语言:javascript
复制
a[i][j] = x*y

代码语言:javascript
复制
a[i][j] = x*x

梯度应该在x方向上,随着x的增加而增加。

代码语言:javascript
复制
Q = ax.quiver(X,Y, velx, vely )

我得到了

如果我把它倒过来

代码语言:javascript
复制
Q = ax.quiver(X,Y, vely, velx )

我得到了

也许有更多的蟒蛇(而且是正确的!)干得好……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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“:

代码语言:javascript
复制
a = X*Y

这应该也适用于更复杂的函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11993790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档