1

配列の各要素を配列の他のすべての要素から減算し、結果の最小差を見つけようとするロジックを実装しようとしています。

例: a=[10,7,3,6]

したがって、最初に配列の他のすべての要素から 10 を減算し (結果は 3,7,4 になります)、次の要素である 7 に移動し、配列の残りの要素からそれを減算します (結果は4,1)、次の要素、つまり 3 を取り、それを残りの要素 6 で減算します (結果: -3)。注:実際の問題の結果の絶対値を取得する必要があります。ご覧のとおり、この減算プロセスの結果の最小差は 1 です。

ここまでコードを書くことができました。ただし、最小差の結果値が 1 である数値のインデックスも見つける必要があります (つまり、この例では 7 と 6 のインデックス)。

NumPyでこれを実装する機能があれば、誰でもどうですか? argwhere() を使用してみましたが、成功しませんでした。

4

2 に答える 2

2

You might want to consider a different algorithm for finding the closest pair. Your current algorithm compares every pair of values, when you really only need to compare each value to the next biggest value. You can do that by doing something like: 1) sort your array a 2) Compare neighbors in a to find the smallest difference. This might help you get started.

import numpy as np
a = np.array([10, 7, 3, 6])

index = np.argsort(a)
a_sorted = a[index]
diff = a_sorted[1:] - a_sorted[:-1]

Also to find where a == 6 you can do this (but you probably shouldn't need this):

where_a_is_6 = np.where(a == 6)[0]
于 2012-10-21T22:26:52.467 に答える
0

これは、NumPy を使用しないやや高密度のワンライナーです。

>>> from itertools import combinations
>>> a = [10, 7, 3, 6]
>>> closest_pair = min((abs(x-y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))[1]
>>> closest_pair
(1, 3)

これがどのように機能するかです...

combinationsすべてのペアを作成するために使用されます。

>>> list(combinations(a, 2))
[(10, 7), (10, 3), (10, 6), (7, 3), (7, 6), (3, 6)]

要素のインデックスが必要なので、次のように変更します。

>>> list(combinations(enumerate(a), 2))
[((0, 10), (1, 7)),
 ((0, 10), (2, 3)),
 ((0, 10), (3, 6)),
 ((1, 7), (2, 3)),
 ((1, 7), (3, 6)),
 ((2, 3), (3, 6))]

リスト内包表記はこの結果に作用し、絶対差と対応するインデックスのペアの新しいリストを形成します。

>>> [(abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2)]
[(3, (0, 1)), (7, (0, 2)), (4, (0, 3)), (4, (1, 2)), (1, (1, 3)), (3, (2, 3))]

最小値を取ると、最初の値が最小絶対距離で、2 番目の値がインデックスのタプルであるタプルが得られます。

>>> min((abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))
(1, (1, 3))

最後に、その結​​果からインデックスだけを引き出します。

>>> min((abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))[1]
(1, 3)
于 2012-10-21T19:32:48.240 に答える