You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:52:50