【问题标题】:very slow function with two for loops using Arcpy in python在python中使用Arcpy的带有两个for循环的非常慢的函数
【发布时间】:2014-09-28 23:55:02
【问题描述】:

我编写的代码可以完美地处理小数据,但是当我在具有 52000 个特征的数据集上运行它时,它似乎卡在了下面的函数中:

def extract_neighboring_OSM_nodes(ref_nodes,cor_nodes):
    time_start=time.time()
    print "here we start finding neighbors at ", time_start
    for ref_node in ref_nodes:
        buffered_node = ref_node[2].buffer(10)
        for cor_node in cor_nodes:
            if cor_node[2].within(buffered_node):
                ref_node[4].append(cor_node[0])
                cor_node[4].append(ref_node[0])
    #        node[4][:] = [cor_nodes.index(x) for x in cor_nodes if x[2].within(buffered_node)]
    time_end=time.time()
    print "neighbor extraction took ", time_end
    return ref_nodes

ref_node 和 cor_node 是一个元组列表,如下所示: [(FID、点、几何、链接、邻居)] 邻居是一个空列表,将在上述函数中填充。

正如我所说,打印出来的最后一条消息是此函数中的第一个打印命令。看起来这个功能太慢了,但对于 5200 万个功能,它不应该需要 24 小时,不是吗? 任何想法问题出在哪里或如何使功能更快?

【问题讨论】:

  • 想想当你有 52000 个特征时发生的操作数。
  • 我知道,但我怎样才能让它更快呢?它已经运行了将近一个晚上:(
  • 要么更改算法以减少操作次数,要么使用更快的语言(如 C),或两者兼而有之。
  • 52000 个特征还是样本point 有 52000 个特征?
  • @SAM:点就是特征。我需要找到距离参考点 10 米内的邻居。

标签: python function for-loop arcpy


【解决方案1】:

【讨论】:

  • 据我了解,对于多处理,您需要有独立的工作。但是在这里我有一个完整的数据集,其每个节点都应该与另一个数据集中的每个节点进行检查。我怎么能有独立的工作。除了我将我的数据分成几个图块并为每个图块分配一个独立的工作。你有什么其他的建议吗?
  • 这对我来说听起来很合理。
【解决方案2】:

如果您想获取数据集的每个(或一些,无关紧要的)样本或样本的 eps 邻域的 K 最近邻,则无需自己实现。有专门为此目的的图书馆。

一旦他们构建了数据结构(通常是某种树),您就可以查询某个样本的邻域数据。通常对于高维数据,这些数据结构不如低维数据好,但对于高维数据也有解决方案。

我可以在这里推荐一个KDTree,它有一个Scipy implementation

我希望你发现它和我一样有用。

【讨论】:

  • 我正试图了解这个库。希望我当前的数据结构不需要更改。该文件说数据需要像数组一样。我的结构是元组字典。这与这个类兼容吗?我不确定我是否能完全理解它。
  • Scikit learn 有一些关于数据以及如何使用邻居库的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2015-06-27
  • 2016-09-07
  • 1970-01-01
  • 2018-05-24
  • 2014-06-21
相关资源
最近更新 更多