Python中不同尺寸数组的2D点匹配问题求助
问题解决:KDTree匹配不同形状数组的点
报错原因
你的数组形状搞反了:scipy.spatial.KDTree要求输入数组的形状是**(样本数, 特征数)**,也就是每行对应一个数据点(比如每个点的ra和dec)。而你当前的A和B是(2, N)的形状(特征数在前,样本数在后),导致KDTree误把2当成样本数、25919当成特征数,传入B时特征数不匹配,触发报错。
修改方案
核心是将数组转置,把形状从(2, N)转为(N, 2),让每行对应一个(ra, dec)点。
基础代码(欧氏距离适用场景)
import numpy as np from scipy.spatial import KDTree # 假设decamra、decamdec、ra、dec都是一维numpy数组 # 转置数组,将特征维度(ra/dec)放到列,样本数放到行 A = np.array([decamra, decamdec]).T # 转置后形状:(25919, 2) B = np.array([ra, dec]).T # 转置后形状:(64788, 2) # 基于A构建KDTree tree = KDTree(A) # 查询B中每个点在A的半径r范围内的匹配点 results = tree.query_ball_point(B, r=r) # 统计B中符合条件的点的数量(只要有匹配就算) valid_count = sum(1 for match_list in results if len(match_list) > 0) # 如果需要统计所有A-B的匹配总次数(比如一个B点匹配多个A点时多次计数),用下面的代码 # total_matches = sum(len(match_list) for match_list in results)
球面坐标(经纬度)适配
如果你的ra/dec是天文经纬度(角度单位),欧氏距离会有误差,需要用球面距离计算:
import numpy as np from scipy.spatial import KDTree # 将角度转为弧度 A_rad = np.radians(np.array([decamra, decamdec]).T) B_rad = np.radians(np.array([ra, dec]).T) # 使用haversine球面距离,r需转为弧度(比如r=1角分,就是1/60弧度) tree = KDTree(A_rad, metric='haversine') results = tree.query_ball_point(B_rad, r=np.radians(r_degrees)) valid_count = sum(1 for match_list in results if len(match_list) > 0)
内容的提问来源于stack exchange,提问作者Payton Bartz
相关产品推荐
相关产品推荐

