我得到了一个电磁样本的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周的业余爱好者,所以请保持温柔;))。数量的结果是我所期望的,但阶段非常糟糕,我不知道为什么......
我的方法:
将原始数组切换为real和imag子数组:
import numpy, cmath
real = ex1[::2] #numpy.ndarray
imag = ex1[1::2] #numpy.ndarray
在列表理解之外定义lambdas:
magcalc = lambda z, y: abs(complex(z, y))
phasecalc = lambda z,y: cmath.phase(complex(z, y))
定义列表理解以对子数组进行数学运算:
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))])
检查原始数组中的结果:
print ex1[:4]
如果我这样做,第一个Ex样本的阶段结果是0.574 rad
。如果我手动检查相位(即cmath.phase(complex(z1Ex.real,z1Ex.imag))
),那么我得到0.703 rad
。如果我的列表理解中存在错误,我会接受,但是幅度结果是完全正确的,所以我怀疑是这样。
我在哪里做错了?我真的试着连续两天找到,没有运气......而且,我想不出另一种方法来实现我想要的。
请帮忙......(使用Python 2.7)
由于 尼尔斯
答案 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[]
这一行以包含幅度......所以,只需更改列表推导的变量名就可以了:
定义列表理解以对子数组进行数学运算:
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))])
然后重新分配给原始磁力相位阵列:
检查原始结果
real[:] = realcopy
imag[:] = imagcopy
print ex1[:4]
抱歉浪费时间和字节......
干杯 尼尔斯