4

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()

これは速度場に対して間違った結果を与えます:

スカラー フィールドの間違った結果

グラフが正常に見える唯一の方法は、震えのコンポーネントを反転することです。

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

との正しい結果

それは行または列の順序付けのようなものだと思いますが、 np.gradient の出力が反転されているのか、それとも quiver が反転されているのかわかりません。1 次元の問題はすべて期待どおりに機能しています。ありがとう!

編集:これがどのように反転されるかをさらに明確にするために、関数を変更します

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 )

私は得る

右

たぶん、もっとPython的な(そして正しい!)方法があります...

4

1 に答える 1

3

私はあなたが正しいと思います (これは配列の順序付けの問題です)。 aは次のように構築されてa[yidx,xidx]いますが、グラデーションを取得するときは、次のようにし velx, vely = np.gradient(a)ますvely, velx = np.gradient(a)。0番目の軸に沿った勾配はvely(おそらくd/dy(a) = vely)を与えるはずなので?-- 何かが足りない場合を除きます (その場合は、この回答を喜んで削除します)。

aまた、ネストされたリストなしで" " を構築できると思うことに注意してください。

a = X*Y

これは、より複雑な機能でも機能するはずです...

于 2012-08-16T19:10:17.280 に答える