“浮动”对象在列表理解中不可迭代

时间:2019-05-05 09:53:47

标签: python numpy

我有两个熊猫系列plgtrd,它们已经变成列表并包含整数。 当plg为负数时,我想为trdplg创建一个校正计算,但是我不确定如何用列表推导来解决这个问题。

我尝试过:

    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]

5 个答案:

答案 0 :(得分:1)

您可以使用zip()plg_uptrd_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)]

这使您可以按预期比较btrd_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,只需尝试forwhile循环

例如:

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)

如其他答案所示,您可以使用enumerateplg访问具有相同索引的元素。另外,对于第一个列表,您可以使用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)]