Spectrum1D 无法将 u.dimensionless_unscaled 数量识别为数量
Spectrum1D does not recognize u.dimensionless_unscaled quantity as a Quantity
我正在准备一些光谱分析,这将涉及组合三个重叠光谱。其中两个光谱具有 "dimensionless" 单位(一个和反照率的单位为 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
,后者的单位为u.dimensionless_unscaled
),然后生成一个名为 dataSpectrum
的 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.
文档和错误文本似乎都表明我正在尝试做的事情应该有效。我还尝试将整个数组转换为 u.Quantity
对象,但由于某种原因它不会粘住(在我可以进一步操作它们之前,元素转换回 np.float64
)。
然后我有两个问题: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>)>
简而言之,您正在创建 Python list
个 Quantity
标量,其中 list
是 Python 中的标准异构集合,没有特定的意义。但是 Astropy Quantity
可以存储单个标量值,或具有相同单位的任意大小的值数组。因此,当您已经拥有相同单位的值数组时,这就是您想要的。参见 Creating Quantity instances。
看来你可能在某个时候尝试过这个:
I have also tried converting whole arrays into u.Quantity
objects, which for some reason does not stick.
在不知道你做了什么的情况下,我不能说为什么它没有 "stick",但上面的例子应该有效。也不是说您可以将 ndarray
转换为 Quantity
只需将数组乘以所需的单位即可。它基本上是相当于 Quantity(array, unit)
.
的语法糖
我正在准备一些光谱分析,这将涉及组合三个重叠光谱。其中两个光谱具有 "dimensionless" 单位(一个和反照率的单位为 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
,后者的单位为u.dimensionless_unscaled
),然后生成一个名为 dataSpectrum
的 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.
文档和错误文本似乎都表明我正在尝试做的事情应该有效。我还尝试将整个数组转换为 u.Quantity
对象,但由于某种原因它不会粘住(在我可以进一步操作它们之前,元素转换回 np.float64
)。
然后我有两个问题: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>)>
简而言之,您正在创建 Python list
个 Quantity
标量,其中 list
是 Python 中的标准异构集合,没有特定的意义。但是 Astropy Quantity
可以存储单个标量值,或具有相同单位的任意大小的值数组。因此,当您已经拥有相同单位的值数组时,这就是您想要的。参见 Creating Quantity instances。
看来你可能在某个时候尝试过这个:
I have also tried converting whole arrays into
u.Quantity
objects, which for some reason does not stick.
在不知道你做了什么的情况下,我不能说为什么它没有 "stick",但上面的例子应该有效。也不是说您可以将 ndarray
转换为 Quantity
只需将数组乘以所需的单位即可。它基本上是相当于 Quantity(array, unit)
.