2

私は現在、matplotlib を使用してPyQuante量子化学パッケージの線および等高線プロット関数を作成しています。ポイントの (npts,3) 配列に沿って基底セットを評価するいくつかの優れた関数があります。

from somewhere import basisset, line
bfs = basisset(h2) # Generate a basis set
points = line((0,0,-5),(0,0,5)) # Create a line in 3d space
bfmesh = bfs.mesh(points)
for i in range(bfmesh.shape[1]):
    plot(bfmesh[:,i])

これは、すべての基底関数を一度に評価するため高速です。また、stackoverflow のここここで、それらを非常に優れたものにするための大きな助けを得ました。

これを更新して、等高線図も作成したいと思います。私が過去にこれを行った遅い方法は、linspace() を使用して 2 つの 1 次元ベクトルを作成し、meshgrid() を使用してこれらを 2D グリッドにメッシュ化し、次にすべての xyz ポイントを反復処理してそれぞれを評価することです。

f = np.empty((50,50),dtype=float)
xvals = np.linspace(0,10)
yvals = np.linspace(0,20)
z = 0
for x in xvals:
    for y in yvals:
        f = bf(x,y,z)
X,Y = np.meshgrid(xvals,yvals)
contourplot(X,Y,f)

(これは実際のコードではありません -- 何かばかげたことをした可能性があります)

私がやりたいことは、等高線図の例で行ったのとほぼ同じ方法でメッシュを生成し、それを (npts,3) ポイントのリストに「解きほぐし」、新しい高速ルーチンを使用して基底関数を評価することです、次に、contourplotでプロットするためにX、Yマトリックスに「再分解」します。

問題は、単純に .ravel() を呼び出すことができるものがないことです。xvals と yvals の 1D メッシュ、2D バージョンの X、Y、および単一の z 値があります。

これを行うための素敵でpythonicな方法を考えられる人はいますか?

4

1 に答える 1

1

fの関数として表現できる場合は、次の方法で Python を回避できます。XYfor-loop

import matplotlib.pyplot as plt
import numpy as np


def bf(x, y):
    return np.sin(np.sqrt(x**2+y**2))

xvals = np.linspace(0,10)
yvals = np.linspace(0,20)
X, Y = np.meshgrid(xvals,yvals)
f = bf(X,Y)
plt.contour(X,Y,f)
plt.show()

収量

ここに画像の説明を入力

于 2013-07-02T16:10:29.090 に答える