6

表1に似た20以上の表があります。ここで、すべての文字は実際の値を表しています。

Table 1:
$ / cars |<1 | 2 | 3 | 4+
<10,000  | a | b | c | d
20,000   | e | f | g | h
30,000   | i | j | k | l
40,000+  | m | n | o | p

ユーザー入力は、たとえば、f、g、j、およびkの間の値である(2.4、24594)である可能性があります。この双一次補間を計算するためのPython関数の定義と擬似コードは次のとおりです。

def bilinear_interpolation( x_in, y_in, x_high, x_low, y_low, y_high ):
   # interpolate with respect to x
   # interpolate with respect to y
   # return result

表1のデータ(ファイル、dict、タプルのタプル、またはリストのdict)をどのように保存すれば、双一次内挿を最も効率的かつ正確に実行できますか?

4

3 に答える 3

7

私が考えることができる最も計算効率の高いソリューションが必要で、標準ライブラリに制限されていない場合は、scipy/numpy をお勧めします。まず、a..p 配列を 2D numpy 配列として保存し、次に $4k-10k と 1-4 配列の両方を 1D numpy 配列として保存します。両方の 1D 配列が単調に増加している場合は scipy の interpolate.interp1d を使用し、そうでない場合は interpolate.bsplrep (二変量スプライン表現) を使用し、サンプル配列がサンプルと同じくらい小さいです。または、単に自分で書いて、scipy を気にしないでください。ここではいくつかの例を示します。

# this follows your pseudocode most closely, but it is *not*
# the most efficient since it creates the interpolation 
# functions on each call to bilinterp
from scipy import interpolate
import numpy
data = numpy.arange(0., 16.).reshape((4,4))  #2D array
prices = numpy.arange(10000., 50000., 10000.)
cars = numpy.arange(1., 5.)
def bilinterp(price,car):
    return interpolate.interp1d(cars, interpolate.interp1d(prices, a)(price))(car)
print bilinterp(22000,2)

私が最後にチェックしたとき(2007年以降のscipyのバージョン)、xとyの単調に増加する配列に対してのみ機能しました)

この4x4配列のような小さな配列の場合、これを使用したいと思います:http: //docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.bisplrep.html#scipy.interpolate.bisplrepより興味深い形状のサーフェスであり、関数は一度作成するだけで済みます。より大きな配列の場合は、これが必要だと思います (interp1d と同じ制限があるかどうかはわかりません): http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html#scipy. interpolate.interp2d ですが、どちらも上記の例の 3 つの配列とは異なり、より詳細なデータ構造を必要とします。

于 2009-05-24T04:28:26.643 に答える
3

最初の列のソートされたリストを保持bisectし、標準ライブラリのモジュールを使用して値を探します。これは、すぐに低いインデックスとすぐに高いインデックスを取得するための最良の方法です。他のすべての列は、この列と並行して別のリストとして保持できます。

于 2009-05-24T02:25:32.390 に答える
0

ユースケースを特に奇妙にする双一次内挿について特別なことは何もありません。2回のルックアップ(完全な行/列のストレージユニットの場合)または4回のルックアップ(配列タイプのストレージの場合)を実行する必要があります。最も効率的な方法は、アクセスパターンとデータの構造によって異なります。

例が本当に代表的なもので、合計16のエントリがある場合は、好きなように保存でき、あらゆる種類の正常な負荷に対して十分に高速になります。

于 2009-05-24T02:23:35.730 に答える