我正在准备一些光谱分析,这将涉及合并三个重叠的光谱。其中两个光谱具有“无量纲”单位(一个为反照率,单位为flux/flux;另一个为滤波响应,单位为photons/photons)。我想使用specutils和astropy使其更容易并且通常避免重新发明任何轮子。但是,我很难将数据转换为Spectrum1D类型的对象。这是相关的代码片段:import numpy as npimport astropyfrom astropy import units as ufrom specutils import Spectrum1DdataSpectrumFileName = 'filename.dat' # Declare filenamedataSpectrumRaw = list(np.loadtxt(dataSpectrumFileName).T) # Load file.#Now dataSpectrumRaw[0] is the wavelength grid and dataSpectrumRaw[1] is the dimensionless spectrum.# Declare unitsdataSpectrumRaw[0] = [ u.Quantity(dataSpectrumRaw[0][i],u.micrometer) for i inrange(len(dataSpectrumRaw[0])) ]dataSpectrumRaw[1] = [ u.Quantity(dataSpectrumRaw[1][i],u.dimensionless_unscaled) for i inrange(len(dataSpectrumRaw[1])) ]# Convert to Spectrum1D itemdataSpectrum = Spectrum1D(spectral_axis = dataSpectrumRaw[0], flux = dataSpectrumRaw[1])我的期望是,这将加载我的数据,将原始数值信息转换为两个Quantity类型的对象列表(前者的单位为u.micrometer,后者的单位为u.dimensionless_unscaled),然后生成一个类型的对象,名为Spectrum1D,具有所有相关信息和相关功能。确实,在运行我的代码片段的最后一行之前进行的检查显示:>>>dataSpectrumRaw[0][0]0.2 um>>>type(dataSpectrumRaw[0][0])<class 'astropy.units.quantity.Quantity'>>>>dataSpectrumRaw[1][0]0.269681>>>type(dataSpectrumRaw[1][0])<class 'astropy.units.quantity.Quantity'>但是,在完全编译以上代码时,出现错误:Traceback (most recent call last): File "/Users/[REDACTED]/specutilsExperiments.py", line 40, in <module> dataSpectrum = Spectrum1D(spectral_axis = dataSpectrumRaw[0], flux = dataSpectrumRaw[1]) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/specutils/spectra/spectrum1d.py", line 71, in __init__ raise ValueError("Flux must be a `Quantity` object.")ValueError: Flux must be a `Quantity` object.文档和错误文本似乎都表明我正在尝试做的事情。我还尝试将整个数组转换为dataSpectrum对象,由于某些原因,该对象不会粘连(在我进一步操作它们之前,元素会转换回u.Quantity)。然后我有两个问题:1)为什么这不能按预期进行? 2)如何使它按预期工作?请尽可能回答两个问题;没有1)的答案,我可能会再次遇到这个问题。 最佳答案 我认为您正在使事情变得不必要的复杂。像这样尝试:>>> spectrum_raw = np.loadtxt(filename).T # no reason to convert to a list>>> spectral_axis = spectrum_raw[0] * u.micrometer>>> flux = spectrum_raw[1] * u.dimensionless_unscaled>>> spectrum = Spectrum1D(spectral_axis=spectral_axis, flux=flux)>>> spectrum<Spectrum1D(flux=<Quantity [0.79502858, 0.68160812, 0.04951287, 0.86626975, 0.35146137, 0.13505172, 0.24077603, 0.65288882, 0.24230813, 0.51846452]>, spectral_axis=<Quantity [0.41284773, 0.23807243, 0.14288542, 0.99212095, 0.75582049, 0.1175328 , 0.66007513, 0.48731926, 0.07727119, 0.02389908] um>)>简而言之,您正在创建list标量的Python Quantity,其中list是Python中的标准异构集合,没有特定含义。但是Astropy Quantity可以存储单个标量值,也可以存储相同单位的任意大小的值数组。因此,当您已经具有相同单位的值数组时,这就是您想要的。请参见Creating Quantity instances。看来您可能在某个时候尝试过: 我还尝试将整个数组转换为u.Quantity对象,由于某种原因,该对象不会粘住。在不知道您做了什么的情况下,我无法说出为什么它没有“坚持”,但是上面的示例应该可以工作。同样,只要将数组乘以所需的单位,就可以将ndarray转换为Quantity。它基本上是等价于Quantity(array, unit)的语法糖。关于python - Spectrum1D无法将u.dimensionless_unscaled数量识别为数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59365024/ 10-14 17:42