2

サイズが〜200000の大きな配列で、サイズが〜20の小さな配列を一致させようとしています。どちらの配列にも double 値が含まれています。この場合の一致は、正確な一致がないため、最小のエラーを意味します。

次のことは、小さな配列の値を変更する必要があることです。これは、値が異なるが値の間に同じギャップがある場合にも一致する必要があるためです。つまり、次のことを意味します。

array 1: [1.3, 1.4, 1.3, 1.5, 1.7]
array 2: [..., 2.3, 2.4, 2.4, 2.5, 2.7, ...]

各比較の最後の要素を同じ数にする必要があります。上記の例は、最初に配列 #1 全体を +1.0 するため、非常によく一致します。

[編集] 上記のステートメントを明確にするために: エラーを計算する前に、例の配列は次のようになります。

array 1: [2.3, 2.4, 2.3, 2.5, 2.7] 
// (+1 of each element so the last element of the small array, 
// and the last element of the part of the large array I am 
// comparing to, has the same values: in this case: 2.7)
array 2: [..., 2.3, 2.4, 2.4, 2.5, 2.7, ...]

[/編集]

大きな配列を単純に反復処理できることはわかっていますが、遅すぎます。もちろん、配列を繰り返し処理して誤差を計算する代わりに、norm(v1 - v2) のようなベクトル演算を使用できます。

Pythonは数学演算に非常に適していると聞いたことがありますが、2つの配列(配列内の1つの数値のみ)を比較する方法が見つかりませんでした。

最後に、質問は次のとおりです。アイデアがあれば、どうすれば問題を非常に迅速に解決できますか。この種の問題を解決するのに適した言語はどれですか (オクターブは、ベクトル計算が速いだけでなく、反復が遅いためです) - おそらく Python には優れたライブラリがいくつかありますか?

もっと詳しく説明する必要がある場合はお知らせください。

4

1 に答える 1

0

私はあなたの定義がどのように最もよく一致するかについて少し曖昧であることを認めますが、この例は非常に簡単に調整できます. 魔法は、と同じ長さclosenessのスライスを受け取り、数値を返す関数にあります。数値が低いほど、一致度が高くなります。datatarget

import random

target = [random.random() * 10 for i in range(20)]
data   = [random.random() * 10 for i in range(200000)]

def closeness(a_range):
    diffs = list(map(lambda e: e[0]-e[1], zip(a_range, target)))
    avg_diffs = float(sum(diffs)) / len(diffs)
    adjusted_target = [i + avg_diffs for i in target]
    return sum(adjusted_target)

ranges = [data[i:i+len(target)] for i in range(len(data)-len(target))]
best_match = min(ranges, key=closeness) 

print(best_match)
于 2012-07-13T04:06:57.270 に答える