在一个数据集中找到另一个数据集的数据对应关系
我有一个数据目录,想在我的MCMC代码中使用它。关键是要实现速度快,这样才能避免拖慢我的马尔可夫链蒙特卡洛采样。
问题:在这个目录中,第一列和第二列有两个参数,叫做ra
和dec
,它们是天空坐标:
data=np.loadtxt('Final.Cluster.Shear.NegligibleShotNoise.Redshift.cat')
ra=data[:,0]
dec=data[:,1]
然后在第七列和第八列有X
和Y
位置,也就是网格坐标,它们是在一个网格空间中的点。
Xpos=data[:,6]
Ypos=data[:,7]
在我写的一个函数中,这个函数需要被调用大约一百万次,我会给它一个Xcenter
和Ycenter
的位置(比如Xcenter=200.6,Ycenter=310.9)作为输入,我想找到在ra
和dec
列中对应的点。不过,有可能输入的值在ra
和dec
中没有实际的对应关系。所以我想在没有相似的X
和Y
以及ra
和dec
数据的情况下,进行插值计算,基于目录中真实的ra
和dec
条目来获得插值坐标。
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()
非常高效地获取你的 ra
和 dec
值:
dists, indices = k.query(xyCenters)
myra = np.take(ra, indices)
mydec = np.take(dec, indices)