gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:16:00 26 4
gpt4 key购买 nike

我得到了一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com