Mam listę wektorów (w języku Python), które chcę znormalizować, jednocześnie usuwając wektory, które pierwotnie miały małe normy.Zmienna pośrednia w zrozumieniu listy do równoczesnego filtrowania i transformacji
Lista wejściowa to np.
a = [(1,1),(1,2),(2,2),(3,4)]
I muszą być wyjście (x * n r * n) z n = (X * 2 + y x 2) ** - 0,5
Jeśli to potrzebne normy, na przykład, że będzie łatwo z listowego:
an = [ (x**2+y**2)**0.5 for x,y in a ]
byłoby również łatwe do przechowywania zaledwie znormalizowane X, też, na przykład, ale to, co chcę jest mieć tę zmienną tymczasową „n ", do użycia w dwóch obliczeniach, i wyrzucić go.
Nie mogę po prostu użyć funkcji lambda, ponieważ potrzebuję również n do filtrowania listy. Jaki jest najlepszy sposób?
Teraz używam tego pod listowych tutaj (z wyrazem na liście wewnętrznej):
a = [(1,1),(1,2),(2,2),(3,4)]
[(x*n,y*n) for (n,x,y) in (((x**2.+y**2.)**-0.5 ,x,y) for x,y in a) if n < 0.4]
# Out[14]:
# [(0.70710678118654757, 0.70710678118654757),
# (0.60000000000000009, 0.80000000000000004)]
Lista wewnętrzna generuje krotki z dodatkową wartość (n), a następnie użyć tych wartości do obliczeń i filtrowania. Czy to naprawdę najlepszy sposób? Czy są jakieś okropne nieskuteczności, o których powinienem wiedzieć?
Dzięki, że ładnie wygląda. Funkcja iteracji jest naprawdę lepsza dla czegoś bardziej skomplikowanego. – dividebyzero
O wyborze wektora, n jest w rzeczywistości odwrotnością normy, wynosi ** - 0,5, a nie ** 0,5. Dlatego mnożenie przez n zamiast podziału.Dzieje się tak dlatego, że zamierzam użyć określonej funkcji do obliczenia przybliżonego pierwiastkowania kwadratowego w przybliżeniu, zamiast używać potęgowania lub np. 1/(sqrt (x)). – dividebyzero