【发布时间】:2015-01-26 20:32:53
【问题描述】:
晚上好,
我目前正在从事大学一年级项目,以模拟连续渗透。这涉及在 n 维空间中将一些圆盘/球体/超球体随机分布在正方形/立方体/超立方体上,并找到跨越边界的连接粒子簇。
为了加快所有这些粒子之间本质上的碰撞检测以将它们组合成连接的簇,我决定使用空间分区,以便我的程序可以很好地随粒子数量进行缩放。这需要我用大小均匀的盒子/立方体/超立方体划分 n 维空间,并将粒子放置在相关盒子内,以便可以进行优化的碰撞检查,这需要更少的比较,因为只有位于相邻盒子/立方体/超立方体中的粒子到需要检查新粒子所在的位置。所有细节都经过算法处理。
但是,使用“维度”等于所研究空间的 ndarray 似乎是个好主意。然后 ndarray 中的每个“点”本身将包含一个粒子对象数组。很容易查看 ndarray 中存在于新粒子周围坐标中的对象,并循环遍历包含在那些本身包含必须进行检查的其他粒子的数组中的数组。然后我发现 ndarray 只能包含固定大小的对象,这些粒子数组不是,因为它们随着粒子随机添加到系统中而增长。
一个普通的 numpy 数组数组(等)是唯一的解决方案,还是存在类似于 ndarray 但能够容纳可变大小对象的结构? Ndarray 看起来很棒,因为它是 numpy 的一部分,它是用编译语言 c 编写的,所以它会很快。此外,一个ndarray不需要和循环来构造,因为我相信一个数组数组(等等......)会(注意:空间的维数和空间划分的增量不是恒定的,因为可以添加不同半径的粒子,表示空间划分正方形/立方体/超立方体大小的变化)。
速度在这个程序中非常重要,如果看到我发现的算法上好的优化被糟糕的实现所破坏,那将是一种耻辱!
【问题讨论】:
-
你可以制作一个'object'的ndarray - 然后你可以填充它,例如列表或任何其他对象。您失去了使用 ndarray 的一些速度优势,但仍然具有多维切片等。 .nonzero() 方法尤其有用。
-
听起来你想要更多类似K-d tree 的东西。 K-d 树上的最近邻搜索是 O(log(N))
-
numpy数组与dtype=object失去了传统数字numpy数组的大部分速度优势。它们比美化的 Python 列表要好一点。
标签: python arrays numpy multidimensional-array