Python - 列表理解中的lambda给出了错误的结果

时间:2016-05-08 00:30:22

标签: python-2.7 lambda list-comprehension

我得到了一个电磁样本的numpy.ndarray作为复数,其格式如下:

ex1:
[[  8.23133235e-15,  -1.59200901e-15,  -4.39818917e-13,   7.68089585e-13]
 [  6.98151957e-15,  -1.20306059e-15,   9.83923013e-13,   1.64838108e-11]
 [  8.41053742e-15,  -1.77702007e-15,  -5.98961364e-13,   8.97436205e-13]
 [  7.08443026e-15,  -1.25262430e-15,   1.11415868e-12,   1.69346186e-11]]

其中行交替组成实部和虚部:

[[z1Ex.real, z1Ey.real, z1Hx.real, z1Hy.real],
 [z1Ex.imag, z1Ey.imag, z1Hx.imag, z1Hy.imag],
 [z2Ex.real, z2Ey.real, z2Hx.real, z2Hy.real],
 [z2Ex.imag, z2Ey.imag, z2Hx.imag, z2Hy.imag],
        ...etc.]

我想要的是创建一个新的数组,它以大小和相位表示数据,但保持相同的格式(即用行数替换实际行,用相行代替虚数)。

我设法为这两个计算提供了列表理解(我非常自豪,作为一个2周的业余爱好者,所以请保持温柔;))。数量的结果是我所期望的,但阶段非常糟糕,我不知道为什么......

我的方法:

  1. 将原始数组切换为real和imag子数组:

    import numpy, cmath
    
    real = ex1[::2] #numpy.ndarray
    imag = ex1[1::2] #numpy.ndarray
    
  2. 在列表理解之外定义lambdas:

    magcalc = lambda z, y: abs(complex(z, y))
    phasecalc = lambda z,y: cmath.phase(complex(z, y))
    
  3. 定义列表理解以对子数组进行数学运算:

    real[:] = np.array([[magcalc(z,y) for z, y in zip(real[x],imag[x])] for x in xrange(len(real))])
    
    imag[:] = np.array([[phasecalc(z,y) for z, y in zip(real[x],imag[x])] for x in xrange(len(imag))])
    
  4. 检查原始数组中的结果:

    print ex1[:4]
    
  5. 如果我这样做,第一个Ex样本的阶段结果是0.574 rad。如果我手动检查相位(即cmath.phase(complex(z1Ex.real,z1Ex.imag))),那么我得到0.703 rad。如果我的列表理解中存在错误,我会接受,但是幅度结果是完全正确的,所以我怀疑是这样。

    我在哪里做错了?我真的试着连续两天找到,没有运气......而且,我想不出另一种方法来实现我想要的。

    请帮忙......(使用Python 2.7)

    由于 尼尔斯

1 个答案:

答案 0 :(得分:1)

哦,jeez ..现在我看到了这个问题,不敢相信我的密集程度......感谢John,让我重新思考变量任务。

imag[:] = np.array([[phasecalc(z,y) for z, y in zip(real[x],imag[x])] for x in xrange(len(imag))])中,我引用real[],好像它仍然填充了实际值。但我之前改变了real[]这一行以包含幅度......所以,只需更改列表推导的变量名就可以了:

  1. 定义列表理解以对子数组进行数学运算:

    realcopy[:] = np.array([[magcalc(z,y) for z, y in zip(real[x],imag[x])] for x in xrange(len(real))])
    
    imagcopy[:] = np.array([[phasecalc(z,y) for z, y in zip(real[x],imag[x])] for x in xrange(len(imag))])
    
  2. 然后重新分配给原始磁力相位阵列:

    1. 检查原始结果

      real[:] = realcopy
      imag[:] = imagcopy
      
      print ex1[:4]
      
    2. 抱歉浪费时间和字节......

      干杯 尼尔斯