Spectrum1D 无法将 u.dimensionless_unscaled 数量识别为数量

Spectrum1D does not recognize u.dimensionless_unscaled quantity as a Quantity

我正在准备一些光谱分析,这将涉及组合三个重叠光谱。其中两个光谱具有 "dimensionless" 单位(一个和反照率的单位为 flux/flux;另一个为滤波器响应,单位为 photons/photons)。我想使用 specutilsastropy 来使这更容易,并且通常避免重新发明任何轮子。

但是,我很难将数据转换为 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),然后生成一个名为 dataSpectrumSpectrum1D 类型对象,其中包含所有相关信息和相关功能。事实上,在我的代码片段的最后一行 运行 之前进行的检查显示:

>>>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 listQuantity 标量,其中 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).

的语法糖