Ho una raccolta di punti N
in tre dimensioni. Questi sono memorizzati come np.array
con una forma di (N,3)
. Tutti i punti sono distinti con la distanza minima tra due punti qualsiasi ~1e-5
. Sto cercando un modo per ottenere un ordine in cui iterare su questi punti che è sia indipendente dal loro ordine corrente nel np.array
che da perturbazioni da robuste a piccole dei singoli componenti.NumPy: np.lexsort con confronti sfocati/tolleranti
I mezzi più semplici per soddisfare il primo requisito è con np.lexsort
con
np.lexsort(my_array.T)
tuttavia questo non riesce nel reparto robustezza:
In [6]: my_array = np.array([[-0.5, 0, 2**0.5], [0.5, 0, 2**0.5 - 1e-15]])
In [7]: my_array[np.lexsort(my_array.T)]
Out[7]:
array([[ 0.5 , 0. , 1.41421356],
[-0.5 , 0. , 1.41421356]])
dove possiamo vedere che in questo caso l'ordine è estremamente sensibile alle perturbazioni. Pertanto, sto cercando una variante fuzzy di np.lexsort
che si sposterà sull'asse successivo se due valori in un asse rientrano nella tolleranza di epsilon
. (O qualsiasi altro meccanismo alternativo che mi permetta di ottenere un ordinamento.)
Poiché la mia applicazione ha diversi milioni di queste raccolte, che devono essere ordinate, le prestazioni sono una preoccupazione (motivo per cui non ho provato ciecamente rotolare il mio np.lexsort tollerante senza prima vedere se c'è un modo migliore per farlo).
Ho bisogno della stessa cosa per ordinare i numeri complessi prima per parte reale e poi per parte immaginaria, ma il tipo di parte reale dovrebbe considerare i numeri uguali se rientrano in una certa tolleranza. Hai mai trovato una soluzione? Quello che stavo facendo prima era usare lexsort per ottenerli prima ordinati in ordine approssimativo, e poi scorrere con un algoritmo bubble-sort-like meno ottimale per raggruppare i valori che sono nell'ordine sbagliato. – endolith