如何在healpix贴图上有效地进行大礼帽(类似磁盘的)平滑处理?

时间:2019-05-14 21:38:32

标签: python smoothing healpy

我有一个高分辨率的healpix贴图(nside = 4096),我想在给定半径的磁盘(例如10 arcmin)中进行平滑处理。

刚开始使用Healpy并阅读了文档,我发现一种(不是很好)的方法是执行“圆锥搜索”,即在每个像素周围找到磁盘内的像素,然后对它们求平均并将这个新值赋予中心的像素。但是,这非常耗时。

import numpy as np
import healpy as hp

kappa = hp.read_map("zs_1.0334.fits") #Reading my file

NSIDE = 4096

t = 0.00290888  #10 arcmin
new_array = []
n = len(kappa)
for i in range(n):
     a = hp.query_disc(NSIDE,hp.pix2vec(NSIDE,i),t)
     new_array.append(np.mean(kappa[a]))  

我认为healpy.sphtfunc.smoothing函数可能会有所帮助,因为它指出您可以输入任何自定义的射束窗口函数,但我根本不了解它的工作原理...

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如建议的那样,通过指定自定义(圆形)光束窗口,我可以轻松地使用healpy.sphtfunc.smoothing函数。

要计算光束窗口,这是我的问题,对于高顶礼帽,healpy.sphtfunc.beam2bl非常有用且简单。

适当的l_max大约为2 * Nside,但根据特定的映射,它可以更小。例如,可以计算角功率谱(Cls),并检查它对l的衰减是否小于l_max,这可以帮助获得更多的时间。

非常感谢在评论部分提供帮助的每个人!

答案 1 :(得分:0)

因为我花了一些时间来弄清楚函数平滑是如何工作的。有一些代码可以让您进行top_hat平滑处理。

干杯

import healpy as hp
import numpy as np
import matplotlib.pyplot as plt

def top_hat(b, radius):
    return np.where(abs(b)<=radius, 1, 0)

nside = 128
npix = hp.nside2npix(nside) 

#create a empy map
tst_map = np.zeros(npix)

#put a source in the middle of the map with value = 100
pix = hp.ang2pix(nside, np.pi/2, 0)
tst_map[pix] = 100


#Compute the window function in the harmonic spherical space which will smooth the map.
b = np.linspace(0,np.pi,10000)
bw = top_hat(b, np.radians(45)) #top_hat function of radius 45°
beam = hp.sphtfunc.beam2bl(bw, b, nside*3)

#Smooth map
tst_map_smoothed = hp.smoothing(tst_map, beam_window=beam)

hp.mollview(tst_map_smoothed)
plt.show()