Chciałbym mieć normę jednej tablicy NumPy. Mówiąc dokładniej, szukam równoważnej wersji tej funkcji
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Czy jest coś takiego w skearn
lub numpy
?
Ta funkcja działa w sytuacji, gdy v
jest to wektor 0.
raise
wyjątkiem!x/np.linalg.norm(x)
nie było to dużo wolniejsze (około 15-20%) niżx/np.sqrt((x**2).sum())
w numpy 1.15.1 na CPU.Odpowiedzi:
Jeśli używasz scikit-learn, możesz użyć
sklearn.preprocessing.normalize
:źródło
normalize
wymaga wejścia 2D. Możesz przekazaćaxis=
argument, aby określić, czy chcesz zastosować normalizację w wierszach lub kolumnach tablicy wejściowej.np.linalg.norm(x)
domyślnie oblicza normę „l2”. Jeśli chcesz, aby suma wektora wynosiła 1, powinieneś użyćnp.linalg.norm(x, ord=1)
ndarray
, aby działał z tąnormalize()
funkcją. W przeciwnym razie może to byćlist
.Zgodziłbym się, że byłoby miło, gdyby taka funkcja była częścią dołączonych baterii. Ale o ile mi wiadomo, nie jest. Oto wersja dla dowolnych osi i zapewniająca optymalną wydajność.
źródło
Możesz określić ord, aby uzyskać normę L1. Aby uniknąć podziału zerowego, używam eps, ale to może nie jest świetne.
źródło
[inf, 1, 2]
zbiorów[nan, 0, 0]
, ale czy nie powinno tak być[1, 0, 0]
?To może również działać dla Ciebie
ale kończy się niepowodzeniem, gdy
v
ma długość 0.źródło
Jeśli masz dane wielowymiarowe i chcesz, aby każda oś została znormalizowana do wartości maksymalnej lub sumy:
Używa funkcji numpys od szczytu do szczytu .
źródło
Istnieje również funkcja
unit_vector()
normalizacji wektorów w popularnym module transformacji Christopha Gohlke:źródło
Wspomniałeś o sci-kit learn, więc chcę podzielić się innym rozwiązaniem.
nauka sci-kit
MinMaxScaler
W uczeniu się sci-kit istnieje interfejs API,
MinMaxScaler
który może dostosowywać zakres wartości, jak chcesz.Zajmuje się także dla nas kwestiami NaN.
Próbka kodu
Kod jest prosty, wystarczy wpisać
Odniesienieźródło
Bez
sklearn
i tylko za pomocąnumpy
. Wystarczy zdefiniować funkcję :.Zakładając, że wiersze są zmiennymi, a kolumny sample (
axis= 1
):wynik:
źródło
Jeśli chcesz znormalizować n wektorów cech wymiarowych przechowywanych w tensorze 3D, możesz również użyć PyTorch:
źródło
Jeśli pracujesz z wektorami 3D, możesz to zrobić zwięźle za pomocą paska narzędzi vg . Jest to lekka warstwa na górze numpy i obsługuje pojedyncze wartości i ułożone wektory.
Bibliotekę utworzyłem przy moim ostatnim uruchomieniu, gdzie była motywowana takimi zastosowaniami: proste pomysły, które są zbyt szczegółowe w NumPy.
źródło
Jeśli nie potrzebujesz najwyższej precyzji, możesz zredukować swoją funkcję do:
źródło
Jeśli pracujesz z tablicą wielowymiarową, możliwe jest szybkie rozwiązanie.
Powiedzmy, że mamy tablicę 2D, którą chcemy znormalizować według ostatniej osi, podczas gdy niektóre wiersze mają zerową normę.
źródło