2017-02-09 8 views
1

I zwei Arrays (data und final) und ich möchte beide Arrays vergleichen und Rücklauf (out), um das Element in data die nicht in finaleffektiv den Vergleich von zwei Arrays unterschiedlicher Größe

Daten:

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 

final:

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

aus:

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 

Dies ist, was ich habe,

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

Problem

Das Problem, das ich habe ist, dass ich diese Aktion auszuführen habe meine out etwa 10000 mal zu bekommen (das Beispiel ist nur ein von 10000) und deshalb ist Geschwindigkeit mein Hauptanliegen.

Gibt es eine effiziente Möglichkeit, dies durchzuführen?

+0

@Divakar arbeitet die np.ravel_multi_index mit ganzen Zahlen. Was ist, wenn meine Daten vom Typ float64 sind? – user7436576

+0

Wie viele Spalten haben Sie in Ihrem tatsächlichen Fall? – Divakar

+0

@Divakar, Ich habe 3 Spalten für beide "final" und "data" – user7436576

Antwort

1

hier ein Ansatz ist -

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) 

Wenn Sie für einige Toleranz berücksichtigen wollen, wenn diese Floating-pt Werte zu vergleichen, können Sie np.isclose() statt == am idx Schritt verwenden.

Probelauf -

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]]) 
Verwandte Themen