在一个数据集中找到另一个数据集的数据对应关系

1 投票
1 回答
584 浏览
提问于 2025-04-18 18:50

我有一个数据目录,想在我的MCMC代码中使用它。关键是要实现速度快,这样才能避免拖慢我的马尔可夫链蒙特卡洛采样。

问题

在这个目录中,第一列和第二列有两个参数,叫做radec,它们是天空坐标

data=np.loadtxt('Final.Cluster.Shear.NegligibleShotNoise.Redshift.cat')
ra=data[:,0]
dec=data[:,1]

然后在第七列和第八列有XY位置,也就是网格坐标,它们是在一个网格空间中的点。

Xpos=data[:,6]
Ypos=data[:,7]

在我写的一个函数中,这个函数需要被调用大约一百万次,我会给它一个XcenterYcenter的位置(比如Xcenter=200.6,Ycenter=310.9)作为输入,我想找到在radec列中对应的点。不过,有可能输入的值在radec中没有实际的对应关系。所以我想在没有相似的XY以及radec数据的情况下,进行插值计算,基于目录中真实的radec条目来获得插值坐标。

1 个回答

2

这是一个很好的例子,说明了如何使用 scipy.spatial.cKDTree() 这个类来一次性查询所有的点:

from scipy.spatial import cKDTree

k = cKDTree(data[:, 6:8]) # creating the KDtree using the Xpos and Ypos

xyCenters = np.array([[200.6, 310.9],
                      [300, 300],
                      [400, 400]])
print(k.query(xyCenters))
# (array([ 1.59740195,  1.56033234,  0.56352196]),
#  array([ 2662, 22789,  5932]))

在这里,[ 2662, 22789, 5932] 是对应于 xyCenters 中三个最近点的索引。你可以利用这些索引,使用 np.take() 非常高效地获取你的 radec 值:

dists, indices = k.query(xyCenters)
myra = np.take(ra, indices)
mydec = np.take(dec, indices)

撰写回答