您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用cKDTree()时的Python中的MemoryError.Query_ball_tree

5b51 2022/1/14 8:20:41 python 字数 2349 阅读 473 来源 www.jb51.cc/python

我有大型2D阵列,带有未分类(X,Y)点,我需要知道哪些点彼此非常接近(最近邻查找).我已经使用cKDTree和query_ball_tree成功获得了大约500,000(X,Y)点的数组.但是,当我为超过1,000,000个点的数据集尝试相同的算法时,query_ball_tree会导致MemoryError.我使用64位Windows和16Gb内部存储器

概述

我有大型2D阵列,带有未分类(X,Y)点,我需要知道哪些点彼此非常接近(最近邻查找).我已经使用cKDTree和query_ball_tree成功获得了大约500,000(X,Y)点的数组.但是,当我为超过1,000,000个点的数据集尝试相同的算法时,query_ball_tree会导致MemoryError.

我使用64位Windows和16Gb内部存储器,并尝试了32位和64位版本的Python和扩展模块(scipy和numpy).

def Construct_SearchTree(AllXyPoints):
    KDsearch = cKDTree(AllXyPoints)  
    return KDsearch.query_ball_tree(KDsearch,Maxdist)

我的问题:

1)有没有人知道cKDTree / query_ball_tree的替代品消耗更少的内存?在这种情况下,内存使用速度不太重要.

2)我希望从32位切换到64位python&扩展将解决MemoryError.可能是什么原因呢?

感谢您的帮助和建议.

BallTree上的查询不会像KDTree那样快,因为您的数据是2D,并且当d <= 3时BallTrees比KDTree慢(参见说明here).但是,鉴于cKDtree和scikit-learn的KDTree都会引发MemorErrors(在我的系统上,无论如何),最简单的解决方案是使用BallTree.

from sklearn.neighbors import BallTree
import numpy as np

max_dist = .1
points = np.random.normal(size=2000000).reshape(1000000,2) #1 million points
ball_tree = BallTree(points)

neighbors = ball_tree.query_radius(points,max_dist)

根据你的Maxdist,返回的结果可能消耗大量内存(最多为O(n ^ 2)),但scikit-learn的BallTree.query_radius()返回np.array的np.array而不是列表列表所以它应该为你节省一些记忆(见this answer的解释).

总结

以上是编程之家为你收集整理的使用cKDTree()时的Python中的MemoryError.Query_ball_tree全部内容,希望文章能够帮你解决使用cKDTree()时的Python中的MemoryError.Query_ball_tree所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶