2016-04-14 11 views
1

Sagen, ich habe zwei Arrays, gleiche Größe, keine Duplikate, jedes Element in Array 1 in array2:Erstellen von Indexkarte für zwei Arrays

arr1 = np.array([100,200,50,150]) 
arr2 = np.array([150,200,100,50]) 

Was ist der beste Weg ist, eine Indexkarte inds zu finden, so dass arr2 [inds] gibt arr1 zurück?

Meine aktuelle Lösung funktioniert, aber ich frage mich, ob es mehr numpyish war etwas, die effizient auf große Arrays wäre:

ind21 = map(lambda x:np.abs(x-arr2).argmin(),arr1) 

In [57]: arr1,arr2[ind21] 
Out[57]: (array([100, 200, 50, 150]), array([100, 200, 50, 150])) 

Antwort

1

OK, meine eigene Frage zu beantworten, ist dies sehr schnell:

ind1 = np.argsort(arr1) 
indrev1 = np.argsort(ind1) 
ind2 = np.argsort(arr2) 
ind21 = ind2[indr1] 

In [101]: arr1,arr2[ind21] 
Out[101]: (array([100, 200, 50, 150]), array([100, 200, 50, 150])) 
+0

Schöne finden, dass man und muss sehr effizient sein! Sehr ähnliche Umstände für einen 2D-Fall führen mich dazu, 'argsort' für eine andere Lösung zu verwenden - http://StackOverflow.com/a/36536068/3293881 – Divakar

0

Das numpy_indexed Paket Haftungsausschluss: ich bin sein Autor) für dieses Problem eine einfache und voll vektorisiert Lösung bietet:

import numpy_indexed as npi 
ind = npi.indices(arr1, arr2) 

Wahrscheinlich ein wenig langsamer als Ihre Lösung, da npi bemüht ist, viel allgemeiner zu sein, und es nutzt die einfache Struktur Ihres Problems nicht voll aus ... obwohl die Gesamtkosten von den gleichen Argsorten beherrscht werden, die hinter dem laufen Szenen.