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的な(そして正しい!)方法があります...