2011-09-12 12 views
0

私は2つの1D numpy配列を持っています。長さは等しくない。私はお互いに近い要素のペア(array1_elemnt、array2_element)を作りたいと思います。例えば、以下の点を考慮することができますどのように不等長の2つのnumpy配列に一致する?

a = [1,2,3,8,20,23] 
    b = [1,2,3,5,7,21,35] 

期待される結果は

[(1,1), 
    (2,2), 
    (3,3), 
    (8,7), 
    (20,21), 
    (23,25)] 

は、5が放置されることに注意することが重要です。それはループで簡単に行うことができますが、私は非常に大きな配列を持っています。私は最近隣を使うことを考えました。しかし、キヤノンで雀を殺すような気がした。

誰も優雅な解決策を提案できますか?

ありがとうございます。

+2

あなたは何を期待しますか:[1,3,5]、[2,4]それは曖昧ですか?またはタイブレーカーのためのより多くの情報がありますか? – amit

+0

@amit、とても素敵な点...この場合...注文は役割[(1,2)、(3,4)]を果たします。 ありがとうございます – Shan

+0

あなたの予想される結果の数字はどこから来ますか?入力配列は常にこのように事前ソートされていますか? – wim

答えて

1

組み込みマップ関数を使用して、これを行う関数をベクトル化することができます。例:

ar1 = np.array([1,2,3,8,20,23]) 
ar2 = np.array([1,2,3,5,7,21,35]) 
def closest(ar1, ar2, iter): 
    x = np.abs(ar1[iter] - ar2) 
    index = np.where(x==x.min()) 
    value = ar2[index] 
    return value 

def find(x): 
    return closest(ar1, ar2, x) 
c = np.array(map(find, range(ar1.shape[0]))) 

上記の例では、ペアになった値を除外したかったようです。その場合、あなたはこのような最初の関数で除去プロセスを含むが、アレイ1のソート方法については非常に注意することができます:

def closest(ar1, ar2, iter): 
    x = np.abs(ar1[iter] - ar2) 
    index = np.where(x==x.min()) 
    value = ar2[index] 
    ar2[ar2==value] = -10000000 
    return value 
2

Needleman-Wunschアルゴリズムの使用はどうですか? :)

スコアリングマトリックスは、2つの数字の間の「距離」がちょうど異なるので、簡単です。しかし、それはおそらく、タンクでスズメを殺すように感じるでしょう

...

+0

@jellybean ... cool ....これは一つのことかもしれない....誰か他の何かが現れたら見える。とにかくありがとうございます。 – Shan

0

私は考えることができる最善の方法は、ループを使用しています。 Pythonのループが遅い場合は、Cythonを使用してコードを高速化できます。

私は1つはこのようにそれを行うことができると思い
0

  1. キー
  2. つまり、値が属する配列に0または1を示す第二の指標が存在するように二つの新しい構造化されたアレイの作成、 、あなたは0キーを持つ要素を横切るときに左スタックにキー1要素を置くアレイを通過し、そして:
  3. は、両方の配列に
  4. ソート最初のフィールドに沿って合体配列(値)
  5. 使用2つのスタックを連結しますそれらを正しいスタックに入れてください。キー0の2番目の要素に到達すると、最初のキー0の場合、左右のスタックの上下をチェックし、最も近い値(おそらく最大距離)をとり、スタックを切り替えて続行します。

ソートは最も遅いステップであり、スタックの最大合計スペースはnまたはmです。

0

あなたは、次の操作を行うことができます

 
a = np.array([1,2,3,8,20,23]) 
b = np.array([1,2,3,5,7,21,25]) 

def find_closest(a, sorted_b): 
    j = np.searchsorted(.5*(sorted_b[1:] + sorted_b[:-1]), a, side='right') 
    return b[j] 

b.sort() # or, b = np.sort(b), if you don't want to modify b in-place 
print np.c_[a, find_closest(a, b)] 

# -> 
# array([[ 1, 1], 
#  [ 2, 2], 
#  [ 3, 3], 
#  [ 8, 7], 
#  [20, 21], 
#  [23, 25]]) 

この必要がありますかなり速い。それがどのように動作するかは、aの各数字について、bのインデックスが2つの数字の中間点、すなわち最も近い数字を超えていることを、searchsortedが見つけることになります。

関連する問題