2016-04-13 13 views
4

Python 2.7を使用すると、〜0.000から〜360.000までの値の配列が複数回あります。私は147.010に近い値を持つすべての配列インデックスを返そうとしています(値が重複していても)ので、後でそれぞれのインデックスを使用することができます。例えば、1列から小さい方のサンプルは以下のとおりです。私は、この場合には、147.01に最も近いインデックスの配列、またはリスト、ためPython配列で指定された数に近い値を見つけよう

array([ 146.749, 147.249, 147.749, 146.749, 147.249, 147.749, 146.749, 147.263, 147.749, 146.472, 147.469, 148.471]) 

探しています次のようになります。

1, 4, 7, 10 
私が試してみました

この:

min(range(len(array)), key=lambda i: abs(array[i]-some_value))

が、複数のインデックスが必要な場合にのみ、一つのインデックスを返します。私は見ましたが、似たような質問や答えは見つかりませんでした。何か助けてくれてありがとう。

+0

問題は最も近い商品を見つけようとしていることですが、何回も何回欲しいのですか?たとえば、最も近いものがリストから削除されるたびに、次に続けるなど、制限を設定する必要があります。そうしないと、最後にすべての値が返されます。重複の場合は –

+0

です。単純です。見つかった最も近い値に等しいすべての値のインデックスなどです。 –

+0

あなたはn個の最も近い数字、または[x-d、x + d]の間隔内のすべての数字を探していますか? – Markus

答えて

0

最も近い値に対応するキーを検索して見つけることができます。次に、それらのキーに対応する値をリストに追加します。

new_array = map(lambda x: abs(x-some_value),my_array) 

min_value=min(new_array) 

今、新たな価値の指標

my_keys = [] 
for i,val in enumerate(new_array): 
    if val == min_value: 
     my_keys.append(i) 

最後に、あなたの出力リストを作成見つけます。

my_answer=[] 
for i in my_keys: 
    my_answer.append(my_array[i]) 
+0

このコードを実行しようとすると、最初の行にエラーメッセージが表示されます。 my_arrayの配列の名前とsome_valueで探している番号を入れます。私はメッセージを受け取っています: 'TypeError:map()には少なくとも2つの引数が必要です'。私は議論がどのように欠落しているかは分かりません。 – WXNerd

+0

修正する必要があります。変数名を変数に置き換える必要があります。 – sebastianspiegel

3

あなたが順序で配列をソートした場合の要素が離れてピボットからある、そしてあなたは、最初のk個の要素とそれらを取ることができるようになりますあなたは

見ている要素に最も近いものです
def k_closest(sample, pivot, k): 
    return sorted(sample, key=lambda i: abs(i - pivot))[:k] 

例:

>>> l = [1,2,3,4] 
>>> k_closest(l, 3, 2) 
[3,2] 
>>> k_closest(l, 3, 3) 
[3,2,4] 

同様の要素のインデックスを取得するには、この操作を行うことができます。

0123前と同じ要素とそれを実行する

が、私たちは、リスト内の各タプルについて

>>> l = [1,2,3,4] 
>>> k_closest(l, 3, 2) 
[(2, 3), (1, 2)] 
>>> k_closest(l, 3, 3) 
[(2, 3), (1, 2), (3, 4)] 

を取得し、最初の要素は、元の配列のインデックスであり、第二は、あなたが実際に興味がある番号です

あなただけのインデックスをしたい場合は、関数に元の入力と実行

import operator 

def k_closest(sample, pivot, k): 
    return map(operator.itemgetter(0), sorted(enumerate(sample), key=lambda (n, v): abs(v - pivot)))[:k] 

になるためのビットを調整することができ、今あなたを与えるだろう

>>> k_closest(l, 3, 2) 
[2, 1] 
>>> k_closest(l, 3, 3) 
[2, 1, 3] 
0

あなたはワンライナーのような場合は、k = 147.01その後、あなたが行うことができますを取るには:

print [i for i, v in enumerate(array) if abs(v - k) == min([abs(x - k) for x in array])] 

出力:[1、4]

それは均等に近い要素の多くのn個の指標として印刷されますkになります。インデックス7のリスト要素で、10が等しく接していない場合は、それらの数値を再度確認できますか?

EDIT:質問からの配列を使用して、の一つ一つを見てみましょう:

[146.749, 147.249, 147.749, 146.749, 147.249, 147.749, 146.749, 147.263, 147.749, 146.472, 147.469, 148.471] 

インデックスでの要素のための距離:1、4、7、10:

index = 1, abs(147.249 - 147.01) = 0.239 
index = 4, abs(147.249 - 147.01) = 0.239 
index = 7, abs(147.263 - 147.01) = 0.253 
index = 10, abs(147.469 - 147.01) = 0.459 

よりますこれらの数字に対して、インデックス1, 4の要素は、147.01からの距離が7, 10より小さい。これはあなたが意味するものではありませんか?

+0

インデックス7と10の数字は自分のデータから正しいです。 – WXNerd

+0

これらの要素を1つずつ比較して私の答えを更新しました。何かが欠落している場合は、気をつけてください。 – fips

関連する問題