2015-02-05 94 views
1

大家好,請原諒我有限的編程知識。我有兩個陣列,如:numpy中不同長度數組的數組比較

A =([[ 0.10111977, 0.5511177 , 0.49532397, 0.42136468, 0.43345532], 
    [ 0.3812068 , 0.97679566, 0.20473656, 0.40256096, 0.32423426], 
    [ 0.2387294 , 0.88714084, 0.01064819, 0.48275173, 0.78234234]]) 

B = ([[ 0.10111977, 0.5511177 , 0.49532397], 
     [ 0.2387294 , 0.88714084, 0.01064819]]) 

(他們實際上有成千上萬的線,但只是爲了演示問題)。我想這兩個比較,以便找到其中B中的線路也存在於以相關行復制到一個新的數組,看起來像:

C =([[ 0.10111977, 0.5511177 , 0.49532397, 0.42136468, 0.43345532], 
    [ 0.2387294 , 0.88714084, 0.01064819, 0.48275173, 0.78234234]]) 

易(蠻力力)解決方案我試圖做的是這樣的:

for rowB in B: 
    for rowA in A: 
     if A[rowA,0]==B[rowB,0] and A[rowA,1]==B[rowB,1] and A[rowA,2]==B[rowB,2]: 
      C.extend(row) 
      continue 

現在這將工作,但正如我所說我的數據集是巨大的,它需要永遠。 有沒有更容易\更快的方式來做到這一點?我想過插值,但我不明白這些數據如何處理。

+0

我想說的是這樣改變你的'if'條件爲:'cmp(rowB,rowA [:3])== 0' - 這會讓閱讀更容易,但不知道是否更快。你的問題在於你對B的每一行都進行了全部的A,我認爲沒有一個好的捷徑。 – TZHX 2015-02-05 13:26:20

+0

你的B數組是從A構造的 - 比方說,通過選擇它,或者A和B都是從父對象中選擇的 - 或者是獨立構造的?如果它的構造方式不同,我們可能必須容忍一些浮點錯誤,這就排除了一些其他方便的方法。 – DSM 2015-02-05 13:33:46

+0

@TZHX感謝您的建議:) – 2015-02-05 13:42:32

回答

0

這與[根據https://wiki.python.org/moin/TimeComplexity平均爲O(n)]更好的時間複雜度的版本:

import numpy as np 

def common_rows(A, B): 
    items = set(tuple(row) for row in B) 
    return np.array([row for row in A if tuple(row[:3]) in items]) 

n = 10000 
A = np.random.rand(n, 5) 
B = np.random.rand(n, 3) 

# Make some common rows 
B[123,:] = A[5775,:3] 
B[1443,:] = A[85,:3] 

print("-- Expected:") 
print(B[123]) 
print(B[1443]) 
print("-- Got:") 
print(common_rows(A, B)) 

numpy的不具有set數據結構,所以我們每一行都在這裏轉化爲Python對象。這有點低效,但對於大型應用程序來說應該更快一些n

+0

謝謝pv。但我認爲這隻適用於相同形狀的陣列。對於我的情況,我得到一個空陣列。 – 2015-02-05 13:36:11

+0

@wormholespacetime:適用於不同形狀的小修改:請參閱更新 – 2015-02-05 13:37:20

+0

哇...似乎工作正常!非常感謝pv。 :) – 2015-02-05 13:41:16

1

您可以使用一套邏輯:

組A &組B將返回所有項目的一個是隻B:

a = set(list1) 
b = set(list2) 
c = a & b 

C現在將包含比賽!

編輯,因爲我沒有看到numpy的參考,如果你搜索的文檔,你可以發現你要尋找的方法:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.intersect1d.html#numpy.intersect1d

+0

謝謝adds68!我也會嘗試 – 2015-02-05 13:44:13

+0

嗯......我認爲這並沒有什麼幫助,因爲我無法找到行所在的位置,以便在新陣列中選擇我想要的元素 – 2015-02-05 13:49:03

+0

您可以只存儲此返回值函數變成另一個變量? c = np.insersect1d(a,b) – adds68 2015-02-05 14:06:01