为大型坐标列表

时间:2016-05-13 12:28:46

标签: python algorithm numpy

我想找到地图上许多(~6000)个地方之间的所有距离。为此,我使用Mapbox's Distance API,它获取最多100个坐标对的列表,并返回它们之间的距离矩阵。 所以,如果你给它:

{
  "coordinates": [
    [13.41894, 52.50055],
    [14.10293, 52.50055],
    [13.50116, 53.10293]
  ]
}

它将返回如下矩阵:

{
  "durations": [
    ["A to A", "A to B", "A to C"],
    ["B to A", "B to B", "B to C"],
    ["C to A", "C to B", "C to C"]
  ]
}

所以,因为我无法向所有6000个地方发送请求,所以我必须分段进行。经过几次尝试,我想出了这个解决方案:

  1. 首先获得一组来自/到对的所有可能的排列,
  2. 然后得到一个随机抽样的子集的所有排列,其大小为100以上,
  3. 从较大的集合中减去较小的集合,并将结果插入第1步
  4. 继续,直到步骤3的结果集为空。
  5. 这里使用Python编写玩具代码(没有实际的API调用,位置用数字表示):

    import itertools
    import random
    
    def get_set(s, rsample_size):
        m_set = set([x[0] for x in s] + [x[1] for x in s])
        if len(m_set) < rsample_size:
            rsample_size = len(m_set)
        sampled = random.sample(set(m_set), rsample_size) #sampling
        return sampled, rsample_size
    
    #all place features, but just numbers here
    master = set(range(500))
    #all possible permutations between them
    master_combinations = set(itertools.permutations(master, 2))
    print 'len of original combinations list', len(master_combinations)
    
    c = 0
    #API call limit
    smpl_size = 100
    while len(master_combinations) > 0:
        print 'start iter: ', c, '\t remaining combinations: ', len(master_combinations)
        #sampling 100 random locations
        combs, smpl_size = get_set(master_combinations, smpl_size)
        #a set of all possible permutations of above 100
        combs = set(itertools.permutations(combs, 2))
        #subtracting calculated pairs from all possible pairs
        master_combinations = master_combinations.difference(combs)
        c += 1
    

    以上示例在132-140次调用中查找所有可能的500个元素对之间的距离。我有两个问题:

    1. 随机抽样似乎是一种非常不精确的方法来确定要发送到API的位置列表,虽然它确实在每种情况下都会收敛,但它有许多重复的结果,
    2. 从Python中设置的一个非常大的(1000万元组)中减去一个大的(一百万个元组)导致在具有16GB RAM的Windows机器上出现内存错误,尽管这不是主要问题。我可以将原始列表划分为更小的版本并应用更复杂的方法。
    3. 我的问题是,因为我显然是通过该列表强行扼要,是否有更优雅和有效的方法呢?

      我想的可能是:

      • 首先使用所有位置组合构建一个6000 x 6000 numpy数组,然后使用60步和一系列偏移对其进行二次采样以产生初始距离,
      • 找出剩下的东西,然后才使用上述浪费的方法。

      任何想法都将不胜感激。谢谢!

0 个答案:

没有答案