2017-10-22 5 views
0

だから私は、それぞれがN_pixのN配列の大きなセットを持っています。私はPythonですべての配列を補間したい(つまり、N個のデータ点を持つN_pix補間を実行する)。ジェネレータ式を受け入れるPython補間メソッド?

問題は、各アレイが非常に大きいことです(それぞれ100sMBのアレイで100sMBになる可能性があるため)、すべてをメモリに読み込まないようにしたいと思います。

私の最初は、しかし、大きなファイルを一つずつ読んで、補間ルーチンにその発電機を渡すためにジェネレータ式を使用していた:

def read_data_from_disc(paths): 
    # Cycle through paths, and yield each large array 
    for path in paths: 
     yield np.loadtxt(path) 

def interpolation(xs, paths): 
    # Iterable returns large arrays one by one. 
    iterable = read_data_from_disc(paths) 
    # Use some interpolation routine that can handle an 
    # iterable and interpolate iterable over 1d array, xs. 
    spline = interpolator(xs, iterable, axis=0) 
    return spline 

しかし、私はそのようなinterpolatorを見つけることに成功していません。私は具体的な実装の詳細をよく知らない。 scipy.interpolate.interp1dまたはscipy.interpolate.CubicSpline(これは通常私が使用しているものです)、おそらく私が求めていることは実際には不可能です。これが当てはまる場合、私はこれらのアレイのすべてを同時にメモリに読み込む必要がないような代替アプローチを提案することができますか?

+0

データポイントが1つの軸に沿って整列していない場合、アップサンプリングまたはサンプルレート変換用のデジタル信号処理/フィルタオプションがあります。 – f5r5e5d

答えて

0

あなたのiterableをループして、1つずつ配列を生成する必要があります。それは、今interpolation機能は、私はあなたの例のコードを使用しての意図である疑いが何である、すべてのスプラインのリストを返します

def interpolation(xs, paths): 
    iterable = read_data_from_disc(paths) 
    splines = [interpolator(xs, array, axis=0) for array in iterable] 
    return splines 

ような何かをしています。 interpolator関数がスプラインオブジェクトの作成後に配列データを格納しない場合は、すべての配列を同時にメモリに保存しないという目標を達成しています。

+0

私は自分の意図を十分にはっきりさせていません。各配列の同じ要素の間を補間したいと思います。私の例では 'len(xs)' = 'N'、配列の数です。あなたの例では、 'len(xs)' = 'N_pix'です。つまり、各配列に沿って別々に補間しています。 –

+0

したがって、すべての配列の各要素 'i'には独自のスプラインが必要ですか?つまり、各スプラインはすべての配列のデータを必要としますか?その場合は、すべての配列をメモリー内にsimultanhusly持つ必要があります。あるいは、 'i番目のスプラインに必要な配列の部分だけを読み込み、' i番目のスプラインを行い、配列データをdelして次の部分を読み込み、繰り返す方法を見つけてください。 –

+0

はい、それは必要な結果です。さて、私はそれが事実かもしれないと思っていた。私はデータの一部だけを読むことはできないだろうと思っています。私はそれについてもっと考えます。 –

関連する問題