質問

私はPythonの初心者です。すでに質問されている場合は申し訳ありません。

Python と numpy を使用して、繰り返し呼び出して、多くの netcdf ファイルにわたるデータを単一の配列に収集しようとしています。 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() 電話。ただし、x の事前割り当てを妨げる要因が 2 つあります。

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

しかし...

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

私の知る限りでは、大きな (1 GB を超える) ファイルが多数 (100 以上) あるため、過剰な割り当てや再形成は現実的ではありません。

最初の質問は、事前割り当ての賢明な方法が欠けているのではないかということです。

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

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

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

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

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

誰かが助けや提案を提供してくれたり、私のアプローチの問題点を特定してくれるなら、私は感謝します。ありがとう

役に立ちましたか?

解決

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

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top