2017-02-09 88 views
1

我有兩個陣列(datafinal),我想比較兩個陣列和返回(out)的元件中data其不在final有效比較不同大小的兩個陣列

數據:

x  y  z 
10.2 15.2 25.2 
15.2 17.2 40.2 
12.2 13.2 5.2 
14.2 14.2 34.2 
12.2 12.2 56.2 
13.2 17.2 32.2 
11.2 13.2 21.2 

決賽:

x  y  z 
15.2 17.2 40.2 
14.2 14.2 34.2 
12.2 12.2 56.2 

出來:

x  y  z 
10.2 15.2 25.2 
12.2 13.2 5.2 
13.2 17.2 32.2 
11.2 13.2 21.2 

這是我做了什麼,

out = [np.column_stack(data[k]) for k in range(len(data)) if data[k] not in final] 
out = np.vstack(out) 

問題

我的問題是,我必須執行讓我out約10000次的這個動作(例子中只是一個10000)以及這樣的速度是我最關心的問題。

有沒有一種有效的方法來執行此操作?

+0

@Divakar的np.ravel_multi_index可與整數。如果我的數據的類型爲float64 – user7436576

+0

您的實際案例中有多少列? – Divakar

+0

@Divakar,我有'最後'和'數據'的3列 – user7436576

回答

1

這裏有一個方法 -

def remrows(a, b): # remove rows from a based on b 
    ab = np.row_stack((a,b)) 
    sidx = np.lexsort(ab.T) 
    ab_sorted = ab[sidx] 
    idx = np.flatnonzero((ab_sorted[1:] == ab_sorted[:-1]).all(1)) 
    return np.delete(a, sidx[idx], axis=0) 

如果你想比較那些漂浮-PT值時,考慮到一些寬容,你可能想使用np.isclose()而不是==idx一步。

採樣運行 -

In [222]: a = np.random.randint(111,999,(10,3)).astype(float)/10.0 

In [223]: a 
Out[223]: 
array([[ 51.3, 66.3, 58.8], 
     [ 24.3, 40.6, 37.8], 
     [ 94.7, 28.8, 69.3], 
     [ 21.8, 48.3, 57.5], 
     [ 87.1, 81.9, 27.9], 
     [ 14.2, 36.4, 22.2], 
     [ 56.7, 58.7, 16.2], 
     [ 66.2, 99.1, 62.5], 
     [ 75.1, 27.8, 34.4], 
     [ 59.7, 73.8, 22.3]]) 

In [224]: b = a[[1,3,5]] 

In [225]: remrows(a, b) 
Out[225]: 
array([[ 51.3, 66.3, 58.8], 
     [ 94.7, 28.8, 69.3], 
     [ 87.1, 81.9, 27.9], 
     [ 56.7, 58.7, 16.2], 
     [ 66.2, 99.1, 62.5], 
     [ 75.1, 27.8, 34.4], 
     [ 59.7, 73.8, 22.3]])