2017-01-29 1 views
3

je un réseau numpy a contenant les nombres entiers arbitraires, et j'ai un autre réseau b, (il y a toujours un sous-ensemble de a, mais l'ordre des chiffres dans b est différente de a. I à aligner les éléments de b dans l'ordre qu'il apparaît dans a.Align tableau numpy selon un autre réseau

a = np.array([4,2,6,5,8,7,10,12]); 
b = np.array([10,6,2,12]), 

Je veux b à aligner comme [2,6,10,12]. Comment puis-je faire en numpy efficacement?

+0

Des éléments en double peuvent-ils être présents dans 'a'? – Divakar

+0

non, il ne peut pas y avoir d'éléments dupliqués dans 'a' – Shew

Répondre

4

Approche # 1: Une approche avec np.in1d, en supposant pas de doublons dans a -

a[np.in1d(a,b)] 

meilleur exemple de cas avec des éléments en a perturbé de sorte que sa non triées pour les éléments communs à présenter un cas de variété -

In [103]: a 
Out[103]: array([ 4, 12, 6, 5, 8, 7, 10, 2]) 

In [104]: b 
Out[104]: array([10, 6, 2, 12]) 

In [105]: a[np.in1d(a,b)] 
Out[105]: array([12, 6, 10, 2]) 

approche # 2: Une approche avec np.searchsorted -

sidx = a.argsort() 
out = a[np.sort(sidx[np.searchsorted(a,b,sorter=sidx)])] 
+0

Vous pouvez ajouter un commentaire pour' in1d' qui suppose qu'il n'y a pas de doublons dans 'a' et' b', alors que '# 2' fonctionne s'il y a des doublons. – MSeifert

+0

Désolé, cela ne nécessite aucun doublon, car les doublons dans 'a' seront dupliqués (peu importe la fréquence de présence dans' b') dans le résultat et les doublons dans 'b' sont ignorés. – MSeifert

+0

@MSeifert Eh bien, s'il n'y a pas de doublons dans 'a' et que' b' est un sous-ensemble de 'a', cela garantit automatiquement que' b' n'aura pas de doublons non plus. Si j'ai compris votre question? – Divakar