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

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

干杯 尼尔斯


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!