首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spectrum1D不将u.dimensionless_unscaled数量识别为数量

Spectrum1D不将u.dimensionless_unscaled数量识别为数量
EN

Stack Overflow用户
提问于 2019-12-16 22:14:31
回答 1查看 343关注 0票数 1

我正在准备一些光谱分析,这将涉及合并三个重叠的光谱。两个光谱有“无量纲”单位(一个和反照率有flux/flux单位;另一个是滤波器响应,用photons/photons表示)。我希望使用specutilsastropy来使这更容易,并且通常避免重新发明任何轮子。

但是,我很难将数据转换为Spectrum1D-type对象。下面是相关的代码片段:

代码语言:javascript
复制
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-type对象列表(前者具有u.micrometer单元,后者具有u.dimensionless_unscaled单元),然后生成一个名为dataSpectrumSpectrum1D-type对象,其中包含所有相关信息和相关功能。实际上,在运行代码段的最后一行之前进行的检查会发现:

代码语言:javascript
复制
>>>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'>

但是,在完全编译上述代码时,我会遇到一个错误:

代码语言:javascript
复制
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)我如何才能使它按预期工作?

如果可能的话,请回答这两个问题;如果没有答案,我很可能再次遇到这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 11:39:55

我觉得你让事情变得更复杂了。试着这样做:

代码语言:javascript
复制
>>> 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>)>

简而言之,您正在创建Quantity标量的Python,其中list是Python中的标准异构集合,没有特定的含义。但是,Astropy Quantity可以存储单个标量值,也可以存储相同单元的任意大小的值数组。这就是你想要的,当你已经在相同的单位中有一个值数组的时候。见创建数量实例

也许你在某个时候尝试过:

我还尝试将整个数组转换为u.Quantity对象,但由于某些原因,这些对象不适用。

不知道你做了什么,我不能说为什么它不“坚持”,但上面的例子应该是有效的。同样,您也不能将ndarray转换为Quantity,只需将数组乘以所需的单元即可。它基本上是相当于Quantity(array, unit)的句法糖。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59365024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档