2016-01-22 26 views
6

Ho due diversi array numpy dati. Primo è matrice bidimensionale che assomiglia (primi dieci punti):Intersezione di due array numpy di dimensioni diverse per colonna

[[ 0.   0.  ] 
[ 12.54901961 18.03921569] 
[ 13.7254902 17.64705882] 
[ 14.11764706 17.25490196] 
[ 14.90196078 17.25490196] 
[ 14.50980392 17.64705882] 
[ 14.11764706 17.64705882] 
[ 14.50980392 17.25490196] 
[ 17.64705882 18.03921569] 
[ 21.17647059 34.11764706]] 

la seconda matrice è solo unidimensionale che assomiglia (primi dieci punti):

[ 18.03921569 17.64705882 17.25490196 17.25490196 17.64705882 
    17.64705882 17.25490196 17.64705882 21.17647059 22.35294118] 

valori dalle la seconda matrice (una dimensione) potrebbe verificarsi nella prima (bidimensionale) nella prima colonna. F.e. 17.64705882

Desidero ottenere un array da quello a due dimensioni in cui i valori della prima colonna corrispondono ai valori nella seconda matrice (una dimensione). Come farlo?

risposta

5

È possibile utilizzare np.in1d(array1, array2) per cercare in array1 ogni valore di array2. Nel tuo caso non resta che prendere la prima colonna della prima matrice:

mask = np.in1d(a[:, 0], b) 
#array([False, False, False, False, False, False, False, False, True, True], dtype=bool) 

È possibile utilizzare questa maschera per ottenere i valori riscontrati:

a[:, 0][mask] 
#array([ 17.64705882, 21.17647059]) 
+2

le consuete precauzioni con floating test di uguaglianza punto si applicano, per esempio '.1 + .1 + .1 == .3' restituisce' False', quindi a meno che i valori siano veramente uguali, non semplicemente equivalenti in aritmetica non in virgola mobile, le cose possono andare molto male. – Jaime

+0

@Jaime ottimo commento. Sai se hanno in programma di aggiungere un parametro 'tolerance' a' np.in1d'? –

+2

Potrebbe avere senso, e per 'in1d' sembra essere un problema ben definito. Non so se qualcuno ci sta lavorando, ma le richieste di pull sono sempre ben accette! ;-) – Jaime

Problemi correlati