Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 列表理解中的Python-lambda给出了错误的结果_Python 2.7_Lambda_List Comprehension - Fatal编程技术网

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

Python 2.7 列表理解中的Python-lambda给出了错误的结果,python-2.7,lambda,list-comprehension,Python 2.7,Lambda,List Comprehension,我得到了一个电磁样本的复数数组,格式如下: 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]

我得到了一个电磁样本的复数数组,格式如下:

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.]
我想要的是创建一个新数组,它以幅值和相位表示数据,但保持相同的格式(即用幅值行替换实行,用相位行替换虚行)

我设法列出了这两种计算的理解列表(作为一个两周的业余爱好者,我感到相当自豪,所以请温柔一点)。震级的结果是我所期望的,但是相位非常差,我不知道为什么

我的做法:

  • 在real和imag子数组中切片原始数组:

    import numpy, cmath
    
    real = ex1[::2] #numpy.ndarray
    imag = ex1[1::2] #numpy.ndarray
    
    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))])
    
    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))])
    
  • 在列表理解之外定义lambda:

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

    import numpy, cmath
    
    real = ex1[::2] #numpy.ndarray
    imag = ex1[1::2] #numpy.ndarray
    
    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))])
    
    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))])
    
  • 检查原始数组中的结果:

    print ex1[:4]
    
  • 如果我这样做,第一个Ex样本的相位结果是
    0.574 rad
    。如果我手动检查相位(即
    cmath.phase(complex(z1Ex.real,z1Ex.imag))
    ),则我得到
    0.703 rad
    。如果在我的理解清单中有smth错误,我会接受,但是震级结果是完全正确的,所以我怀疑这是真的

    我哪里做错了?我真的已经连续两天试图找到答案了,运气不好。。。而且,我想不出另一种方法来实现我想要的

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

    谢谢

    哦,天哪。。现在我看到了问题,真不敢相信我有多笨。。。约翰让我重新思考变量赋值,这是值得赞扬的

    imag[:]=np.array([[phasecalc(z,y)表示z,y表示zip中的y(real[x],imag[x])]表示x范围中的x(len(imag)))
    ,我指的是
    real[]
    ,就好像它仍然填充着实值一样。但是我改变了前面的
    real[]
    行以包含幅值。。。因此,只需更改列表理解的变量名即可:

  • 定义列表理解以对子数组进行计算:

    import numpy, cmath
    
    real = ex1[::2] #numpy.ndarray
    imag = ex1[1::2] #numpy.ndarray
    
    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))])
    
    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相位阵列:

  • 检查原始结果

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

    干杯
    Nils

    感谢您写了一篇关于逐步复制的非常清晰的问题。然而,在最后一步,当我做
    [[phasecalc(z,y)表示z,y在zip中(real[x],imag[x])]表示x在xrange中(len(imag))]时,我得到了
    0.70342
    作为第一个结果。所以我想这是关于你是如何将这个结果分配给其他数组的,但是你还没有向我们展示什么是
    phaserow
    ,所以我说不出来。谢谢你的尝试,John,非常感谢。很抱歉,为了更清楚,我从原始代码中重命名了数组,但我忘记重命名最后两个。我刚刚纠正了那部分。奇怪的是,如果你真的用同样的方法得到了正确的结果……很高兴你把它分类了。你可以“接受”你自己的答案(我知道你必须先等待一个计时器),或者删除这个问题,因为它可能对其他人没有用处