Python 如何有效地在healpix贴图上执行top hat(磁盘状)平滑?

Python 如何有效地在healpix贴图上执行top hat(磁盘状)平滑?,python,smoothing,healpy,Python,Smoothing,Healpy,我有一个高分辨率的healpix图(nside=4096),我想在给定半径的磁盘上平滑,比如说10弧分 对于healpy来说,我是个新手,阅读了文档后,我发现一个不太好的方法是执行“锥形搜索”,即在每个像素周围找到磁盘中的像素,对它们进行平均,并将这个新值赋予中心的像素。然而,这是非常耗时的 import numpy as np import healpy as hp kappa = hp.read_map("zs_1.0334.fits") #Reading my file NSIDE =

我有一个高分辨率的healpix图(nside=4096),我想在给定半径的磁盘上平滑,比如说10弧分

对于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函数可能会有一些帮助,因为它声明您可以输入任何自定义的梁窗口函数,但我完全不理解它是如何工作的


非常感谢你的帮助

如前所述,通过指定自定义(圆形)梁窗口,我可以轻松使用healpy.sphtfunc.smoothing函数

要计算波束窗口(这是我的问题),healpy.sphtfunc.beam2bl对于礼帽来说非常有用和简单

适当的l_max大约为2*Nside,但根据具体地图,它可以更小。例如,我们可以计算角功率谱(Cls),并检查其阻尼是否小于l_max,这有助于获得更多的时间


非常感谢所有在评论部分提供帮助的人

因为我花了一定的时间试图弄清楚函数平滑是如何工作的。有一段代码允许您进行顶级平滑

干杯

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()
将healpy导入为hp
将numpy作为np导入
将matplotlib.pyplot作为plt导入
def顶帽(b,半径):

返回np.where(abs(b)您可以尝试使用“圆形”内核进行a。healpy中的平滑通常在傅里叶空间中进行,其中窗口函数是平滑内核(通常为高斯)的傅里叶变换。如果您想要使用tophat滤波器,您必须计算其变换,这将是sinc函数()。恐怕我没有时间详细研究这个问题,但你100%确定你需要一个tophat滤波器,高斯窗口不适合你的应用吗?@DanielLenz不幸的是,我确定我需要一个tophat…问题是我不确定如何在傅里叶空间中执行卷积,因为它不仅仅是一个“平面”也不是一个规则的网格…我能不能像对待卷积一样对待一切?它不应该在球谐空间中吗?可以找到关于这个主题的一些背景,例如White(1992),他的方程40-46。其思想如下:(I)你在Fourier空间中计算你的波束窗口函数(这是一个棘手的部分,在高斯光束的参考文献中有描述。(ii)将贴图转换为球谐系数a_lm,然后将alm与窗口函数相乘,然后再转换回贴图。hp.smoothing()所有这些都是为了你,你只需要提供正确的窗口函数。我可以建议你添加一个代码片段来说明你所做的事情吗?也许只是生成一个带有随机数的healpy映射,然后用一个圆形光束平滑它?`healpy.sphtfunc.beam2bl`对我们其他人来说不是非常清楚。