2015-01-26 64 views
2

晚上好,包含可变大小物体(物体阵列)的Numpy ndarray

我目前正在进行第一年大学项目,以模拟连续渗流。这涉及在n维空间中随机分布一些盘/球/超球体在正方形/立方体/超立方体上,并找到跨越边界的连接粒子群。为了加速所有这些粒子之间的本质碰撞检测,将它们分组为相互连接的簇,我决定使用空间分区,以便我的程序可以很好地与粒子数量成正比。这要求我将n维空间与均匀大小的盒子/立方体/超立方体分开,并将粒子放置在相关盒子内,以便可以进行优化的碰撞检查,这需要较少的比较,因为只有位于相邻盒子/立方体/超立方体中的粒子到需要检查新粒子的位置。所有的细节已经算出来了。

但是,使用具有与正在研究的空间相等的“维度”的ndarray似乎是个好主意。然后,ndarray中的每个“点”本身都会包含一组粒子对象。很容易查看ndarray中围绕新粒子坐标的对象,并循环遍历包含其他粒子的数组,这些对象包含必须进行检查的其他粒子。然后我发现ndarray只能包含固定大小的对象,这些粒子数组并不是因为它们会随着粒子随机添加到系统中而增长。

阵列(等..)阵列的正常numpy数组是唯一的解决方案或做结构类似于ndarray,但能够容纳可变大小的对象存在吗? Ndarray看起来很棒,因为它是用编译语言c编写的numpy的一部分,所以它会很快。此外,ndarray不会要求和循环构造,因为我相信阵列数组(阵列等)会(注意:空间的维度和空间分割的增量不是恒定的,因为可以添加不同半径的粒子,这意味着空间划分方块/立方体/超立方体的大小的改变)。

速度在这个程序中是非常重要的,看到我发现算法良好的优化会被糟糕的实现所破坏!

+0

你可以制作一个'object'的ndarray,然后你可以用它填充它,例如:列表或任何其他对象。您失去了使用ndarray的一些速度优势,但仍然具有多维切片等等。 .nonzero()方法特别有用。 – greggo 2015-01-26 20:38:00

+0

这听起来像你想沿着[K-d树]的行更多的东西(http://en.wikipedia.org/wiki/K-d_tree)。最近邻上K-d树搜索是* O(日志(N))* – 2015-01-26 21:00:54

+0

'numpy'阵列用'D型= object'松动大多数传统的数字'numpy'阵列的速度的优点。它们比列表的Python列表更好。 – hpaulj 2015-01-26 22:48:05

回答

3

您是否考虑过使用kd-tree? kd-trees支持通过分割空间来快速枚举一个点的邻居(很像你对多维数组提供的建议)。

作为一个不错的奖金,还有已经在SciPy的,同伴项目NumPy的体面kd树实现:scipy.spatial.KDTree