1

私はPythonを初めて使用します。これがすでに尋ねられている場合はお詫びします。

python と numpy を使用して、繰り返し呼び出して、多数の netcdf ファイルのデータを 1 つの配列に収集しようとしていますappend()

素朴に、私はこのようなことをしようとしています:

from numpy import *
from pupynere import netcdf_file

x = array([])
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x = append(x, xFragment)

通常の状況では、呼び出しごとに新しいメモリを再割り当てするため、これは悪い考えであることはわかっていappend()ます。ただし、次の 2 つのことが x の事前割り当てを思いとどまらせます。

1)ファイルは必ずしも軸0に沿って同じサイズであるとは限りません(ただし、後続の軸に沿って同じサイズである必要があります)。そのため、xの最終サイズを事前に計算するために、事前に各ファイルから配列サイズを読み取る必要があります。

でも...

2)私が知る限り、pupynere(および他のnetcdfモジュール)は、ファイルを開くと、単なる参照(他の環境の多くのnetcdfモジュールなど)ではなく、ファイル全体をメモリにロードします。したがって、事前に割り当てるには、ファイルを 2 回開く必要があります。

多くの (>100) 大きな (>1GB) ファイルがあるため、私が知る限り、過剰な割り当てと再形成は実用的ではありません。

私の最初の質問は、事前に割り当てるためのインテリジェントな方法が欠けているかどうかです。

2 番目の質問はもっと深刻です。上記のスニペットは、1 次元配列に対して機能します。しかし、マトリックスにロードしようとすると、初期化が問題になります。1 次元配列を空の配列に追加できます。

append( array([]), array([1, 2, 3]) )

しかし、空の配列を行列に追加することはできません:

append( array([]), array([ [1, 2], [3, 4] ]), axis=0)

x.extend(xFragment) のようなものは機能すると思いますが、numpy 配列にこの機能があるとは思いません。最初のファイルを特別なケースとして扱うことで、初期化の問題を回避することもできますが、より良い方法があれば回避したいと思います。

誰かが助けや提案を提供できる場合、または私のアプローチの問題を特定できる場合は、感謝します. ありがとう

4

1 に答える 1

1

この 2 つの問題は、最初に files ファイルから配列のリストに配列をロードし、次にconcatenateを使用してすべての配列を結合することで解決できます。このようなもの:

x = [] # a normal python list, not np.array
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x.append(xFragment)

combined_array = concatenate(x, axis=0)
于 2010-04-15T06:35:11.103 に答える