我有两个熊猫系列plg
和trd
,它们已经变成列表并包含整数。
当plg
为负数时,我想为trd
和plg
创建一个校正计算,但是我不确定如何用列表推导来解决这个问题。
我尝试过:
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)]
plg
正确返回,并且3元素返回正数,但是`trd_up'似乎无法遍历Zero()函数,因为它是一个列表。我是否只需要为Zero()创建的列表添加另一个enumerate()索引?
我可以通过将Zero()的参数包含在列表中来对此进行修复:
trd_up = [Zero([i - np.pi]) if plg[index] < 0 else i for index,i in enumerate(trd)]
但这会返回列表中的列表:
[2.0943951023931953,
2.8623399732707,
[0.3839724354387517],
4.71238898038469,
5.410520681182422,
1.1344640137963142,
2.1816615649929116,
2.129301687433082,
2.775073510670984,
2.9146998508305306]
答案 0 :(得分:1)
您可以使用zip()
从plg_up
和trd_up
生成元素的元组:
[(i,b) for (i,b) in zip(plg_up, trd_up)]
[(1.3962634, 2.0943951), (1.57079633, 2.86233997), (0.52359878, 6.658750399999999), (0.61086524, 4.71238898), (0.83775804, 5.41052068), (0.17453293, 1.13446401), (1.36135682, 2.18166156), (1.43116999, 2.12930169), (1.57079633, 2.77507351), (1.57079633, 2.91469985)]
这使您可以按预期比较b
和trd_up
的各个值:
[i - np.pi if b < 0 else i for (i,b) in zip(plg_up, trd_up)]
[1.3962634, 1.57079633, 0.52359878, 0.61086524, 0.83775804, 0.17453293, 1.36135682, 1.43116999, 1.57079633, 1.57079633]
答案 1 :(得分:0)
我将使用.as-console-wrapper { max-height: 100% !important; top: 0; }
来获取当前正在使用的元素的索引。 enumerate
将使您同时获得list元素及其在列表中的位置,我在下面将其称为enumerate
。您可以在列表推导中使用index
来获取index
中的相应元素。
plg
答案 2 :(得分:0)
您同时要检查两个列表中的coressponding元素,可以使用enumerate
来返回元素,而该元素将在另一个列表中的同一位置。
trd_up = [i - np.pi if plg[index]<0 else i for index,i in enumerate(trd)]
答案 3 :(得分:0)
向上是正确的,关键是您需要获取索引。
如果您不想使用enumerate
,只需尝试for
或while
循环
例如:
for i in xrange(len(trd)):
if plg[i]<0:
trd_up[i]=trd[i]-np.pi
else:
trd_up[i]=trd[i]
答案 4 :(得分:0)
如其他答案所示,您可以使用enumerate
从plg
访问具有相同索引的元素。另外,对于第一个列表,您可以使用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)]