2011-09-12 42 views
0

我有兩個1D numpy陣列。長度不相等。我想要使​​對(array1_elemnt,array2_element)的元素相互靠近。讓我們考慮下面的例子如何匹配兩個不等長的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

您的預期結果中的數字「8.7」​​來自哪裏?你的輸入數組是否總是像這樣預先排序? – wim

回答

1

你可以使用內置的map函數來實現這個功能。例如:

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算法? :)

評分矩陣將是微不足道的,因爲兩個數字之間的「距離」只是他們的差異。

但是,這可能會覺得自己殺了麻雀與坦克...

+0

@jellybean ...很酷......這可能是一件事情....讓我們看看是否有人想出了別的東西。 謝謝反正 – Shan

0

我能想到的最好的方法是使用一個循環。如果python中的循環很慢,可以使用Cython來加速你的代碼。

0

我認爲一個能做到這一點是這樣的:

  1. 創建兩個新的結構化陣列,使得存在指示哪個數組的值所屬的第二索引,其是0或1,即,鍵
  2. 級聯兩個陣列沿第一場中的統一陣列(值)
  3. 使用2個疊
  4. 排序:經過所述陣列將與鑰匙1的元素的左側堆棧上,當你交叉的元件與鍵0,把它們放在正確的堆棧中。當你用鍵0到達第二個元素時,首先用鍵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]]) 

這應該相當快。它的工作原理是searchsorted將爲每個數字a找到經過兩個數字之間的中點(即最接近的數字)的b的索引。

相關問題