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

标签 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. 在列表理解之外定义 lambda:

    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]
    

如果我这样做,第一个 Ex 样本的相位结果是 0.574 rad。如果我手动检查相位(即 cmath.phase(complex(z1Ex.real,z1Ex.imag))),那么我会得到 0.703 rad。如果我的列表理解有误,我会接受,但震级结果是完全正确的,所以我怀疑就是这样。

我哪里做错了?我真的已经连续 2 天试图找出答案,但没有运气......另外,我想不出另一种方法来实现我想要的。

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

谢谢 尼尔斯

最佳答案

哦天啊..现在我看到了问题所在,简直不敢相信我的脑子有多大...感谢 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))])
    

然后重新分配给原来的mag,phase arrays:

  1. 查看原始结果

    real[:] = realcopy
    imag[:] = imagcopy
    
    print ex1[:4]
    

抱歉浪费了时间和字节...

干杯 尼尔斯

关于python-2.7 - Python - 列表理解中的 lambda 给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095017/

相关文章:

python - 在 Ubuntu 上安装 SciPy/Python

c# - 如何在 C# 中创建表达式树来表示 'String.Contains("term")'?

python - 使用 Python 3 中的列表理解从单行输入读取整数列表以及范围

Python ctypes : how to allocate output buffer for C function in callback

python - sqlalchemy 查询中的分组/排序依据

java.lang.IllegalStateException : stream has already been operated upon or closed in Java while working with list

c# - LINQ .OrderBy由单个字母然后由另一个字母

python - 列表理解 : Returning two (or more) items for each item

python - 如果缺少键,我可以在字典列表上使用列表理解吗?

python - 从 MediaWiki XML 中提取页面标题和贡献者