J'ai une liste de vecteurs (en Python) que je veux normaliser, tout en supprimant les vecteurs qui avaient à l'origine de petites normes.Variable intermédiaire dans une liste de compréhension pour le filtrage et la transformation simultanés
La liste d'entrée est, par ex.
a = [(1,1),(1,2),(2,2),(3,4)]
Et j'ai besoin que la sortie soit (x * n, y * n) avec n = (x * 2 + y * 2) ** - 0,5
Si je voulais juste la normes, par exemple, ce serait facile avec une compréhension de la liste:
an = [ (x**2+y**2)**0.5 for x,y in a ]
Il serait aussi facile de stocker seulement normalisé x, aussi, par exemple, mais ce que je veux est d'avoir cette variable temporaire « n ", à utiliser dans deux calculs, et le jeter.
Je ne peux pas simplement utiliser une fonction lambda car j'ai aussi besoin du n pour filtrer la liste. Alors, quelle est la meilleure façon?
En ce moment je suis en utilisant cette compréhension de liste imbriquée ici (avec une expression dans la liste intérieure):
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 liste intérieure génère tuples avec une valeur supplémentaire (n), puis-je utiliser ces valeurs pour les calculs et le filtrage. Est-ce vraiment le meilleur moyen? Y a-t-il de terribles inefficacités dont je devrais être conscient?
Merci, qui semble agréable. Une fonction d'itérateur est vraiment mieux pour quelque chose de plus compliqué comme ça. – dividebyzero
A propos de la sélection vectorielle, le n est en fait l'inverse de la norme, c'est ** - 0,5, et non ** 0,5. C'est pourquoi la multiplication par n au lieu d'une division.C'est parce que je prévois d'utiliser une fonction spécifique pour calculer approximativement la racine carrée réciproque, au lieu d'utiliser soit l'exponentiation, soit par ex. 1/(sqrt (x)). – dividebyzero