ho un array/set con interi positivi unici, cioèNumpy trovando indice elemento di un'altra matrice
>>> unique = np.unique(np.random.choice(100, 4, replace=False))
E un array contenente più elementi del campione da questa matrice precedente, come
>>> A = np.random.choice(unique, 100)
Voglio mappare i valori dell'array A
nella posizione in cui tali valori si verificano in unique
.
Quindi la soluzione migliore che ho trovato è attraverso una matrice di mappatura:
>>> table = np.zeros(unique.max()+1, unique.dtype)
>>> table[unique] = np.arange(unique.size)
Le assegna sopra a ciascun elemento l'indice nella matrice, e quindi, può essere utilizzato successivamente per mappare A
attraverso indicizzazione avanzata:
>>> table[A]
array([2, 2, 3, 3, 3, 3, 1, 1, 1, 0, 2, 0, 1, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0,
0, 3, 3, 2, 1, 0, 0, 0, 2, 1, 0, 3, 0, 1, 3, 0, 1, 2, 3, 3, 3, 3, 1,
3, 0, 1, 2, 0, 0, 2, 3, 1, 0, 3, 2, 3, 3, 3, 1, 1, 2, 0, 0, 2, 0, 2,
3, 1, 1, 3, 3, 2, 1, 2, 0, 2, 1, 0, 1, 2, 0, 2, 0, 1, 3, 0, 2, 0, 1,
3, 2, 2, 1, 3, 0, 3, 3], dtype=int32)
Quale già mi dà la soluzione corretta. Tuttavia, se i numeri univoci in unique
sono molto sparsi e grandi, questo approccio implica la creazione di un array molto grande table
solo per memorizzare alcuni numeri per il successivo mapping.
C'è qualche soluzione migliore?
NOTA: sia A
e unique
sono array di campioni, non array reali. Quindi la domanda non è come generare gli indici di posizione, è solo come mappare in modo efficiente gli elementi di A
a indici in unique
, il pseudocodice di quello che vorrei per accelerare in NumPy è il seguente,
B = np.zeros_like(A)
for i in range(A.size):
B[i] = unique.index(A[i])
(supponendo che unique
sia un elenco nello pseudocodice ).
E 'possibile usare' sorter', se 'unique' non è già ordinato. – Divakar