J'ai deux séries de pandas plg et trd que j'ai transformées en listes et contiennent des entiers.
Je souhaite créer un calcul de correction pour plg et trd lorsque plg est négatif, mais je ne sais pas comment aborder cela avec des compréhensions de liste.
J'ai essayé:
[2.0943951023931953, 2.8623399732707, [0.3839724354387517], 4.71238898038469, 5.410520681182422, 1.1344640137963142, 2.1816615649929116, 2.129301687433082, 2.775073510670984, 2.9146998508305306]
plg est renvoyé correctement avec l'élément 3 retourné à positif mais `trd_up 'ne peut pas apparaître pour parcourir la fonction Zero () car il s'agit d'une liste. Aurais-je juste besoin d'ajouter un autre index enumerate () pour la liste créée par Zero ()?
Je peux corriger cela en insérant l'argument de Zero () dans une liste:
trd_up = [Zero([i - np.pi]) if plg[index] < 0 else i for index,i in enumerate(trd)]
Mais cela renvoie une liste dans une liste: p >
plg = [ 1.3962634 , 1.57079633, -0.52359878, 0.61086524, 0.83775804,
0.17453293, 1.36135682, 1.43116999, 1.57079633, 1.57079633]
trd = [2.0943951 , 2.86233997, 9.8087504 , 4.71238898, 5.41052068,
1.13446401, 2.18166156, 2.12930169, 2.77507351, 2.91469985]
Zero = def ZeroTwoPi(a):
"""
Zero constrains azimuth to lie between 0 and 2*pi RADIANS.
Returns azimuth b (from 0 to 2*pi) for input azimuth a.
NOTE: Azimuths a and b are input/output in radians.
"""
b = a;
twopi = 2.0*np.pi
x = [b + twopi if b < 0 else b - twopi if b>= twopi else b for b in a]
return x
plg_up = [-i if i < 0.0 else i for i in plg ]
trd_up = [Zero(i - np.pi) if plg[index] < 0 else i for index,i in enumerate(trd)]
5 Réponses :
J'utiliserais enumerate pour obtenir un index de l'élément sur lequel vous travaillez actuellement. enumerate vous permettra d'obtenir à la fois l'élément de liste et sa position dans la liste, que j'ai appelé index ci-dessous. Vous pouvez utiliser index dans la compréhension de la liste pour obtenir l'élément correspondant dans plg.
trd_up = [i - np.pi if plg[index] < 0 else i for index, i in enumerate(trd)]
Vous souhaitez simultanément vérifier l'élément correspondant dans les deux listes pour lesquelles vous pouvez utiliser enumerate qui vous renverra l'élément à la même position dans l'autre liste.
trd_up = [i - np.pi if plg [index] <0 else i for index, i in enumerate (trd)]
Comment pourrais-je modifier ce code si je modifie ce (i-np.pi) est une liste qui est passée par une fonction qui produit une autre liste? J'ai le format de code suivant:
Le haut est juste, le point clé est que vous devez obtenir l'index.
Si vous ne voulez pas utiliser enumerate , essayez simplement pour ou while loop
Par exemple:
for i in xrange(len(trd)):
if plg[i]<0:
trd_up[i]=trd[i]-np.pi
else:
trd_up[i]=trd[i]
Comme suggéré dans d'autres réponses, vous pouvez utiliser enumerate pour accéder à l'élément avec le même index depuis plg . De plus, pour votre première liste, vous pouvez utiliser la fonction intégrée abs .
plg_up = [abs(x) for x in plg] trd_up = [x - np.pi if plg[i] < 0 else x for i, x in enumerate(trd)]
En effet,
[b <0 for b in plg] est Trues’évalue toujours àFalseSalut Michael, merci! Je ne sais simplement pas comment je pourrais maintenant faire fonctionner (i - np.pi) lorsque b <0 dans plg.