小编Dli*_*net的帖子

最近邻搜索:Python

我有一个二维数组:

MyArray = array([6588252.24, 1933573.3, 212.79, 0, 0],
                [6588253.79, 1933602.89, 212.66, 0, 0],
                 etc...)
Run Code Online (Sandbox Code Playgroud)

前两个元素MyArray[0],并MyArray[1]XŸ点的坐标.

对于数组中的每个元素,我想找到以半径X单位返回其单个最近邻居的最快方法.我们假设这是在2D空间.

让我们说这个例子X = 6.

我通过将每个元素与每个其他元素进行比较来解决问题,但是当列表长度为22k点时,​​这需要15分钟左右.我们希望最终在大约3000万点的名单上运行.

我已经阅读了关于Kd树并了解基本概念,但却无法理解如何编写脚本.

python numpy kdtree nearest-neighbor closest-points

23
推荐指数
1
解决办法
2万
查看次数

Python模块依赖

好的我有两个模块,每个模块都包含一个类,问题是它们的类互相引用.

让我们说例如我有一个房间模块和一个包含CRoom和CPerson的人员模块.

CRoom类包含有关房间的信息,以及房间中每个人的CPerson列表.

然而,CPerson类有时需要将CRoom类用于它的房间,例如找到门,或者看看房间里还有谁.

问题是两个模块互相导入我只是得到一个导入错误,其中第二次导入:(

在c ++中,我可以通过仅包含头来解决这个问题,因为在这两种情况下类都只有指向另一个类的指针,前向声明就足以满足标题,例如:

class CPerson;//forward declare
class CRoom
{
    std::set<CPerson*> People;
    ...
Run Code Online (Sandbox Code Playgroud)

反正有没有在python中执行此操作,除了将两个类放在同一个模块或类似的东西?

编辑:添加了使用上面的类显示问题的python示例

错误:

回溯(最近一次调用最后一次):
文件"C:\ Projects\python\test\main.py",第1行,
从房间导入CRoom
文件"C:\ Projects\python\test\room.py",第1行,
来自人员导入CPerson
文件"C:\ Projects\python\test\person.py",第1行,
从房间导入 CRoom
ImportError:无法导入名称
CRoom room.py

from person import CPerson

class CRoom:
    def __init__(Self):
        Self.People = {}
        Self.NextId = 0

    def AddPerson(Self, FirstName, SecondName, Gender):
        Id = Self.NextId
        Self.NextId += 1#

        Person = CPerson(FirstName,SecondName,Gender,Id)
        Self.People[Id] = Person
        return Person

    def FindDoorAndLeave(Self, PersonId):
        del Self.People[PeopleId]
Run Code Online (Sandbox Code Playgroud)

person.py

from room import CRoom

class CPerson:
    def __init__(Self, …
Run Code Online (Sandbox Code Playgroud)

python module circular-dependency

17
推荐指数
2
解决办法
1万
查看次数

Qsort比较功能

我是C的初学者,我正在尝试理解qsort函数所需的比较函数.

第一部分:语法

一个简单的建议用法就是这个(我已经包含了一些main()代码来打印结果):

#include <stdio.h>
#include <stdlib.h>

int values[] = { 40, 10, 100, 90, 20, 25, 12, 13, 10, 40 };

int compare(const void *a, const void *b)
{
    const int *ia = (const int *)a; // casting pointer types 
    const int *ib = (const int *)b;
    return *ia  - *ib; 
}

int main()
{
    int n;
    for (n=0; n<10; n++)
    {
        printf("%d ",values[n]);
    }
    printf("\n");
    qsort(values, 10, sizeof(int), compare);
    for (n=0; n<10; n++)
    {
        printf("%d ",values[n]);
    }
    printf("\n"); …
Run Code Online (Sandbox Code Playgroud)

c sorting qsort multidimensional-array

10
推荐指数
1
解决办法
2万
查看次数

在C中读取和打印.txt文件行的最清晰方法

有很多方法描述如何使用各种方法在此站点上打印文本文件的行:

它们似乎都是根据具体的例子量身定制的.

如果能够使用最清晰,最简洁,最简单的方法,那就太棒了:将任何文本文件的每一行打印到屏幕上.优选地详细说明每条线的作用.

简洁明了的要点.

c file-io printf scanf file-read

8
推荐指数
1
解决办法
2万
查看次数

优化Python KD树搜索

Scipy(http://www.scipy.org/)提供两个KD Tree类; KDTree和cKDTree.

cKDTree要快得多,但是比KDTree更少可定制和查询(据我从文档中可以看出).

这是我的问题: 我有一个3百万二维(X,Y)点的列表.我需要从每个点返回X单位距离内的所有点.

使用KDtree,有一个选项可以做到这一点:KDtree.query_ball_tree()它生成一个列表,其中包含每个其他点的X个单位内的所有点.但是:这个列表很庞大,很快就会填满我的虚拟内存(大约7.44亿个项目).

潜在的解决方案#1:有没有办法在写入时将此列表解析为文本文件?

潜在的解决方案#2:我尝试使用for循环(对于列表中的每个点),然后通过使用:找到X单位内的单点邻居KDtree.query_ball_point().但是:这需要永远,因为它需要运行数百万次查询.是否有与此KDTree工具相当的cKDTree?

潜在的解决方案#3:打败我,其他人有什么想法?

numpy kdtree nearest-neighbor scipy

5
推荐指数
1
解决办法
3569
查看次数