Mam kolekcję N
punktów w trzech wymiarach. Są one przechowywane jako np.array
o kształcie (N,3)
. Wszystkie punkty są różne, z minimalną odległością między dowolnymi dwoma punktami będącymi ~1e-5
. Szukam sposobu na uzyskanie zamówienia, w którym można powtórzyć te punkty, co jest zarówno niezależne od ich obecnego porządku w np.array
i odporne na małe zakłócenia poszczególnych składników.NumPy: np.lexsort z rozmytymi/tolerancyjnymi porównaniami
Najprostsze sposoby zaspokajania pierwszy warunek jest z np.lexsort
z
np.lexsort(my_array.T)
jednak to się nie powiedzie w dziale solidność:
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]])
gdzie możemy zobaczyć, że w tym przypadku zamawiania jest niezwykle wrażliwy na perturbacje. Dlatego szukam rozmytego wariantu np.lexsort
, który przeniesie się na następną oś, jeśli dwie wartości w jednej osi mieszczą się w granicach tolerancji epsilon
. (Lub dowolny alternatywny mechanizm, który pozwoli mi uzyskać zamówienie).
Ponieważ moja aplikacja ma kilka milionów takich kolekcji, z których wszystkie wymagają zamówienia, wydajność jest czymś niepokojącym (dlatego nie ślepo próbowałam przetasować mój własny tolerancyjny np.lexsort bez uprzedniego sprawdzenia, czy jest lepszy sposób na zrobienie tego).
Potrzebuję tego samego do sortowania liczb zespolonych najpierw przez część rzeczywistą, a potem przez część urojoną, ale prawdziwy podział części powinien uwzględniać liczby równe, jeśli mieszczą się w granicach tolerancji. Czy kiedykolwiek znalazłeś rozwiązanie? To, co robiłem wcześniej, to używanie lexsorta do pierwszego sortowania w przybliżeniu, a następnie iterowanie za pomocą mniej optymalnego algorytmu typu "sortowanie bąbelkowe" w celu zgrupowania wartości, które są w niewłaściwej kolejności. – endolith