在大型numpy数组中近似比较值的最快方法?

时间:2012-08-01 18:38:01

标签: python arrays performance numpy

我有两个数组,数组A包含~1M行,数组B包含~400K行。除了其他之外,每个都包含一个点的坐标。对于数组A中的每个点,我需要找到数组B中有多少点在它的一定距离内。我如何避免天真地比较一切?根据它在开始时的速度,天真地运行将在我的机器上花费10天以上。这需要嵌套循环,但是数组太大而无法构造distance matrix(400G条目!)

我想方法是只针对每个A坐标检查一组有限的B坐标。但是,我还没有确定一种简单的方法。也就是说,做出选择的最简单/最快捷的方法是什么,不需要检查B中的所有值(这是我试图避免的完全相同的任务)?

编辑:我应该提到这些不是2D(或nD)笛卡儿,而是球面(纬度/长度),距离是大圆距离。

2 个答案:

答案 0 :(得分:1)

我现在无法给出完整的答案,但有些暗示可以让你开始。在kd树中组织B中的点会更有效。您可以使用班级scipy.spatial.KDTree轻松完成此操作,并且可以使用此类上的query()方法请求给定距离内的点。

答案 1 :(得分:0)

以下是使用k-d树在球体上的点列表之间交叉匹配的一种可能实现方式。 http://code.google.com/p/astrolibpy/source/browse/my_utils/match_lists.py

另一种方法是使用healpy模块及其get_neighbors方法。