我正在准备一些光谱分析,这将涉及合并三个重叠的光谱。其中两个光谱具有“无量纲”单位(一个和反照率的单位为flux/flux
;另一个光谱的过滤器响应位于photons/photons
中)。我想使用specutils
和astropy
来简化操作,并且通常避免重新发明轮子。
但是,我很难将数据转换为Spectrum1D
类型的对象。这是相关的代码段:
import numpy as np
import astropy
from astropy import units as u
from specutils import Spectrum1D
dataSpectrumFileName = 'filename.dat' # Declare filename
dataSpectrumRaw = list(np.loadtxt(dataSpectrumFileName).T) # Load file.
#Now dataSpectrumRaw[0] is the wavelength grid and dataSpectrumRaw[1] is the dimensionless spectrum.
# Declare units
dataSpectrumRaw[0] = [ u.Quantity(dataSpectrumRaw[0][i],u.micrometer) for i in
range(len(dataSpectrumRaw[0])) ]
dataSpectrumRaw[1] = [ u.Quantity(dataSpectrumRaw[1][i],u.dimensionless_unscaled) for i in
range(len(dataSpectrumRaw[1])) ]
# Convert to Spectrum1D item
dataSpectrum = Spectrum1D(spectral_axis = dataSpectrumRaw[0], flux = dataSpectrumRaw[1])
我希望这会加载到我的数据中,将原始数字信息转换为两个Quantity
型对象列表(前者的单位为u.micrometer
,后者的单位为{{ 1}}),然后生成一个名为u.dimensionless_unscaled
的{{1}}类型的对象,其中包含所有相关信息和相关功能。确实,在运行我的代码片段的最后一行之前进行的检查显示:
Spectrum1D
但是,在完全编译上面的代码时,我得到一个错误:
dataSpectrum
文档和错误文本似乎都表明我正在尝试做的事情。我还尝试将整个数组转换为>>>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.
)。
然后我有两个问题:1)为什么这没有按预期进行? 2)如何使它按预期工作?
请尽可能回答这两个问题;没有1)的答案,我可能会再次遇到这个问题。
答案 0 :(得分: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)
的语法糖。