Tengo una lista de vectores (en Python) que quiero normalizar, mientras que al mismo tiempo elimino los vectores que originalmente tenían pequeñas normas.Variable intermedia en una lista de comprensión para filtrado y transformación simultáneos
La lista de entrada es, p.
a = [(1,1),(1,2),(2,2),(3,4)]
y necesito que la salida sea (x * n, y * n) con n = (x * 2 + y * 2) ** - 0,5
Si sólo necesitaba la normas, por ejemplo, que iba a ser fácil con una lista por comprensión:
an = [ (x**2+y**2)**0.5 for x,y in a ]
también sería fácil de almacenar sólo normalizados x, también, por ejemplo, pero lo que quiero es tener esta variable temporal "n ", para utilizar en dos cálculos, y tirarlo a la basura.
No puedo usar simplemente una función lambda porque también necesito la n para filtrar la lista. Entonces, ¿cuál es la mejor manera?
En este momento estoy usando esta lista por comprensión anidado aquí (con una expresión en la lista interna):
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)]
La lista interna genera tuplas con un valor extra (n), y luego utilizar estos valores para los cálculos y el filtrado ¿Es esta realmente la mejor manera? ¿Hay alguna ineficiencia terrible de la que deba tener conocimiento?
Gracias, que se ve bien. Una función de iterador es realmente mejor para algo más complicado como este. – dividebyzero
Sobre la selección del vector, el n es realmente el recíproco de la norma, es ** - 0.5, y no ** 0.5. Es por eso que la multiplicación por n en lugar de una división.Esto se debe a que planeo usar una función específica para calcular la raíz cuadrada recíproca aproximadamente, en lugar de usar una exponenciación o, por ejemplo, 1/(sqrt (x)). – dividebyzero