2013-06-16 6 views

risposta

-1

Mi sono imbattuto in questo problema una volta. Ho fatto quanto segue: non una soluzione perfetta tanto quanto un elegante trucco.

Per prima cosa trasforma il tuo array 2d in un array 1D o in un elenco selezionabile e da lì è facile. Un modo per trasformare in una matrice 1D di float sarebbe prendere il prodotto punto con un vettore casuale D-dimensionale. es:

a = np.array([[1.32,1,4],[2,3,3.5],[1.32,1,4],[4,5,6.2]]) 

b = np.random.randint(1,10**20,3) 

c = np.dot(a,b) 
vals, idx = np.unique(c,True) 
1

È possibile contare il numero di ciascuna riga univoco utilizzando indicizzazione fantasia e valutazione di una condizione come:

from numpy import unique, array, all 
def myunique(input): 
    u = array([array(x) for x in set(tuple(x) for x in input)]) 
    return u, array([len(input[all(input==x, axis=1)]) for x in u],dtype=int) 

esempio:

a = array([list('1234'), 
      list('1234'), 
      list('1222'), 
      list('1222'), 
      list('1234')],dtype=str) 

print myunique(a) 
#(array([['1', '2', '2', '2'], 
#  ['1', '2', '3', '4']], 
#  dtype='|S1'), array([2, 3])) 
+1

Ho solo pensato di menzionare esplicitamente la tua funzione myunique (x) a ... :) – tantrev

+1

@Trevor, grazie mille, l'ho appena risolto! –

1

Il pacchetto numpy_indexed (disclaimer: Sono il suo autore) ha una funzione che fa esattamente questo, in modo efficiente:

import numpy_indexed as npi 
m = np.random.randint(0, 2, (20, 3)) 
unique, count = npi.count(m) 
Problemi correlati