使用 np.abs 将数据框中的 real 和 imag 列组合成复数以获得幅度
combining real and imag columns in dataframe into complex number to obtain magnitude using np.abs
我有一个数据框,其中包含分为实数列和虚数列的复数。我想在计算对数幅度的数据框中添加一列(实际上是 2 列,每个通道一个):
` ch1_real ch1_imag ch2_real ch2_imag ch1_phase ch2_phase distance
79 0.011960 -0.003418 0.005127 -0.019530 -15.95 -75.290 0.0
78 -0.009766 -0.005371 -0.015870 0.010010 -151.20 147.800 1.0
343 0.002197 0.010990 0.003662 -0.013180 78.69 -74.480 2.0
80 -0.002686 0.010740 0.011960 0.013430 104.00 48.300 3.0
341 -0.007080 0.009033 0.016600 -0.000977 128.10 -3.366 4.0
如果我试试这个:
df['ch1_log_mag']=20*np.log10(np.abs(complex(df.ch1_real,df.ch1_imag)))
我收到错误:“类型错误:无法将系列转换为 ”,因为我认为 cmath.complex 无法处理数组。
所以我然后尝试使用 loc 来挑选出 ch1_real 的第一个元素,例如,然后找出如何使用它来完成我想做的事情,但无法弄清楚怎么做:
df.loc[0,df['ch1_real']]
这会产生 KeyError。
暴力破解有效,
df['ch1_log_mag'] = 20 * np.log10(np.sqrt(df.ch1_real**2+ df.ch1_imag**2))
但是,我相信使用 np.abs 来获取幅度更清晰,而且我更感兴趣的是了解数据帧和索引数据帧的工作原理以及为什么我最初尝试的方法不起作用。
顺便说一下,df.ch1_real 和 df['ch1_real'] 有什么区别?我什么时候使用一个与另一个?
编辑:更多尝试解决方案
我尝试使用应用,因为我的理解是它将传递给它的函数“应用”到每一行(默认情况下):
df.apply(complex(df['ch1_real'], df['ch1_imag']))
但这会产生相同的 TypeError,因为我认为问题是 complex 不能在 Series 上工作。也许如果我将系列投射到浮动?
读完这个 post 后,我尝试使用 pd.to_numeric 将系列转换为 float 类型:
dfUnique.apply(complex(pd.to_numeric(dfUnique['ch1_real'],errors='coerce'), pd.to_numeric(dfUnique['ch1_imag'],errors='coerce')))
无济于事。
您可以用表示复数 0+1j
的 1j
进行简单乘法运算,请参阅 imaginary literals:
df['ch1_log_mag'] = 20 * np.log10((df.ch1_real + 1j * df.ch1_imag).abs())
complex(df.ch1_real, df.ch1_imag)
不起作用,因为它需要一个浮点参数,而不是整个系列。 df.loc[0,df['ch1_real']]
不是有效的表达式,因为第二个参数必须是字符串,而不是系列(df.loc[79,'ch1_real'] 可用于访问元素)。
如果你想使用 apply
它应该是 20 * np.log10(df.apply(lambda x: complex(x.ch1_real, x.ch1_imag), 1).abs())
但因为 apply 只是一个伪装的数据帧行的循环,所以不推荐性能。
df.ch1_real
和df['ch1_real']
没有区别,看个人喜好。如果您的列名称包含空格或点等,则必须使用后一种形式。
我有一个数据框,其中包含分为实数列和虚数列的复数。我想在计算对数幅度的数据框中添加一列(实际上是 2 列,每个通道一个):
` ch1_real ch1_imag ch2_real ch2_imag ch1_phase ch2_phase distance
79 0.011960 -0.003418 0.005127 -0.019530 -15.95 -75.290 0.0
78 -0.009766 -0.005371 -0.015870 0.010010 -151.20 147.800 1.0
343 0.002197 0.010990 0.003662 -0.013180 78.69 -74.480 2.0
80 -0.002686 0.010740 0.011960 0.013430 104.00 48.300 3.0
341 -0.007080 0.009033 0.016600 -0.000977 128.10 -3.366 4.0
如果我试试这个:
df['ch1_log_mag']=20*np.log10(np.abs(complex(df.ch1_real,df.ch1_imag)))
我收到错误:“类型错误:无法将系列转换为
所以我然后尝试使用 loc 来挑选出 ch1_real 的第一个元素,例如,然后找出如何使用它来完成我想做的事情,但无法弄清楚怎么做:
df.loc[0,df['ch1_real']]
这会产生 KeyError。
暴力破解有效,
df['ch1_log_mag'] = 20 * np.log10(np.sqrt(df.ch1_real**2+ df.ch1_imag**2))
但是,我相信使用 np.abs 来获取幅度更清晰,而且我更感兴趣的是了解数据帧和索引数据帧的工作原理以及为什么我最初尝试的方法不起作用。
顺便说一下,df.ch1_real 和 df['ch1_real'] 有什么区别?我什么时候使用一个与另一个?
编辑:更多尝试解决方案 我尝试使用应用,因为我的理解是它将传递给它的函数“应用”到每一行(默认情况下):
df.apply(complex(df['ch1_real'], df['ch1_imag']))
但这会产生相同的 TypeError,因为我认为问题是 complex 不能在 Series 上工作。也许如果我将系列投射到浮动?
读完这个 post 后,我尝试使用 pd.to_numeric 将系列转换为 float 类型:
dfUnique.apply(complex(pd.to_numeric(dfUnique['ch1_real'],errors='coerce'), pd.to_numeric(dfUnique['ch1_imag'],errors='coerce')))
无济于事。
您可以用表示复数 0+1j
的 1j
进行简单乘法运算,请参阅 imaginary literals:
df['ch1_log_mag'] = 20 * np.log10((df.ch1_real + 1j * df.ch1_imag).abs())
complex(df.ch1_real, df.ch1_imag)
不起作用,因为它需要一个浮点参数,而不是整个系列。 df.loc[0,df['ch1_real']]
不是有效的表达式,因为第二个参数必须是字符串,而不是系列(df.loc[79,'ch1_real'] 可用于访问元素)。
如果你想使用 apply
它应该是 20 * np.log10(df.apply(lambda x: complex(x.ch1_real, x.ch1_imag), 1).abs())
但因为 apply 只是一个伪装的数据帧行的循环,所以不推荐性能。
df.ch1_real
和df['ch1_real']
没有区别,看个人喜好。如果您的列名称包含空格或点等,则必须使用后一种形式。