2

私はいくつかのnetCDFファイルを持っています。各方向(、、x)に24個yz異なる時間の値を持つ24個です。最後の時点で、すべてのタイムステップのデータをプロットする必要があります。

プロットでは、特定のポイントで補間する必要があるため、最近傍を知る必要があります。私の計画は、データを3Dセルに分割することです。これにより、データセット全体で最近傍を検索する必要がなくなります。

[x,y,z,v[:]]したがって、最初のステップでは、データファイルを読み込んで、各ポイントの座標と各時間の値を含む配列を作成します。

その後、各ポイントについて、それが属するセルを計算し、それを4次元の配列に追加します:x、、、および:yzv

for vec in vecs:
    x_ind = int((vec[0]-xmin) / stepWidthX) 
    y_ind = int((vec[1]-ymin) / stepWidthY) 
    z_ind = int((vec[2]-zmin) / stepWidthZ) 

    if x_ind==gridPointsInXdirection:
        x_ind = x_ind-1
    if y_ind==gridPointsInYdirection:
        y_ind = y_ind-1
    if z_ind==gridPointsInZdirection:
        z_ind = z_ind-1
    #print z_ind, y_ind,x_ind

    XGridPoints[z_ind, y_ind, x_ind] = np.append(XGridPoints[z_ind, y_ind, x_ind], vec[0])
    YGridPoints[z_ind, y_ind, x_ind] = np.append(YGridPoints[z_ind, y_ind, x_ind], vec[1])
    ZGridPoints[z_ind, y_ind, x_ind] = np.append(ZGridPoints[z_ind, y_ind, x_ind], vec[2])
    VGridPoints[z_ind, y_ind, x_ind] = np.append(VGridPoints[z_ind, y_ind, x_ind], vec[3])

vecsすべてのデータポイントを含む配列はどこにありますか。これまでのところ機能していますが、私の問題はVGridPoints次のとおりです。配列のリストではなく、値のリストが長いです。後で次のようにアクセスできるように、配列要素に配列を追加するソリューションはありますか?

x = XGridPoints[2,3,4][2]
y = YGridPoints[2,3,4][2]
z = ZGridPoints[2,3,4][2]
v[:] = VGridPoints[2,3,4][2]

タイムステップを1つだけ実行すると機能しますが、タイムステップごとにセルと最も近い隣接セルを再計算すると、大きなオーバードライブが発生し、時間の経過とともに場所が変更されません。

4

1 に答える 1

2

作業するアレイの形状を事前に知っている場合は、Numpyの方が一般的にはるかに便利です。配列への追加のようなものは、パフォーマンスの低下を被ります。私はSebastianに同意します。最も簡単な方法は、(可能であれば)すべてを保持するのに十分な大きさの配列を作成することです(最悪のシナリオ)。これが不可能な場合は、オブジェクト配列を試してみてください。たとえば、次の3つの空間次元を持つオブジェクト配列を作成します。

import numpy as N
XGridPoints = N.empty((nx, ny, nz), dtype='object')

(、、、についても同じです。)次に、numpy配列に設定YGridPointsし、必要に応じてその配列に追加できます。ZGridPointsVGridPointsXGridPoints[z_ind, y_ind, x_ind]

于 2012-08-27T17:17:53.030 に答える