gpt4 book ai didi

python - numpy 数组梯度和 matplotlib quiver 的倒序

转载 作者:行者123 更新时间:2023-11-28 17:50:00 26 4
gpt4 key购买 nike

我正在使用 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()

这给出了速度场的错误结果:

Wrong result for the scalar field

图形看起来不错的唯一方法是如果我反转箭袋上的组件:

    Q = ax.quiver(X,Y, vely, velx )#WHY???

Right result with the "wrong" expression

我怀疑这类似于行或列排序,但我无法弄清楚 np.gradient 的输出是否反转,或者 quiver 是否反转。所有一维问题都按预期工作。谢谢!

编辑:只是为了更清楚这是如何反转的,更改函数

a[i][j] = x*y

a[i][j] = x*x

梯度应该在x方向,随着x的增加而增加。结果仍然错误:如果我使用

Q = ax.quiver(X,Y, velx, vely )

我明白了

Still wrong

如果我把它倒过来

Q = ax.quiver(X,Y, vely, velx )

我明白了

Right

也许有更 pythonic(和正确!)的方法来做到这一点......

最佳答案

我认为你是对的,(这是一个数组排序问题)。 a 构建为 a[yidx,xidx] 但是当你采用渐变时,你会这样做:velx, vely = np.gradient(a) 当你应该做 vely, velx = np.gradient(a) 时。由于沿第 0 轴的梯度应该给你 vely(大概是 d/dy(a) = vely)? -- 除非我遗漏了什么(在这种情况下我会很乐意删除这个答案)。

另请注意,我认为您可以在没有嵌套列表的情况下构建“a”:

a = X*Y

它也应该适用于更复杂的功能......

关于python - numpy 数组梯度和 matplotlib quiver 的倒序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com