Healpix如何处理NaN以在天空图上插入数据?

时间:2016-09-15 05:22:58

标签: python numpy scipy healpy

我在datapoint[37][19]空间中使用此格式phi-theta的数据。但由于我的数据无法覆盖整个天空,因此datapoint数组中有一些NaN。整个datapoint中约有一半的NaN。 datapoint中约9/10的非NaN值为负值,其中约1/10为正值。

我试过这个插值函数:

scipy.interpolate.RectSphereBivariateSpline(theta,phi,datapoint.T)

但它返回了错误。我问我如何将包含NaN,正值和负值的数据插入到Healpix可用于制作地图的级别。我有一个由Basemap制作的未平滑地图。

enter image description here

1 个答案:

答案 0 :(得分:0)

我不知道你的问题是关于1)处理丢失的数据,2)处理NaN,或3)将球体上的任意数据转换为Healpix地图。

1)在天空的大面积上插入缺失数据至少需要对数据进行一些统计知识,以便对缺失的内容进行约束。但只有在进行非本地操作(如卷积或渐变)时才需要填补这些空白,这取决于它 您计划如何处理数据。

2)将缺失数据设置为NaN肯定会搞砸所有可用的插值方案。

3)下面的python代码将类似于你的数据集(据我所知)变成2个Healpix地图,一个使用最近点(NGP)采样,另一个使用BSpline插值。 请注意,第二个很可能在NaN存在的情况下不起作用, 而第一个非常强大。

import healpy as hp
import numpy as np
import pylab as pl

datapoint = np.zeros((37,19), dtype=np.float)
datapoint[18,9] = 1.0
datapoint[0,9] = -1.0

nside      = 64
npix       = hp.nside2npix(nside)

# location of Healpix pixels center
ip         = np.arange(npix)
theta_rad, phi_rad = hp.pix2ang(nside, ip)

# map0 : NGP sampling
theta_deg = np.rad2deg(theta_rad)
phi_deg   = np.rad2deg(phi_rad)
hp_0      = datapoint[np.rint(phi_deg/10.).astype(int), \
                      np.rint(theta_deg/10.).astype(int)]
hp.mollview(hp_0,title='NGP map')

# map1: BSpline interpolation
from scipy.interpolate import RectSphereBivariateSpline
epsilon = 1.e-12
th_in = np.linspace(epsilon,  np.pi-epsilon, 19)
ph_in = np.linspace(epsilon,2*np.pi-epsilon, 37)
lut   = RectSphereBivariateSpline(th_in, ph_in, datapoint.T, s=1)
hp_1  = lut.ev(theta_rad, phi_rad)
hp.mollview(hp_1,title='BSpline map')

pl.show()