晚上好,
我目前正在开展大学一年级项目来模拟连续渗透。这涉及到在 n 维空间中的正方形/立方体/超立方体上随机分布一些圆盘/球体/超球体,并找到跨越边界的连接粒子簇。
为了加速所有这些粒子之间的碰撞检测,将它们分组到连接的簇中,我决定使用空间分区,以便我的程序可以很好地随着粒子数量的变化而扩展。这需要我用均匀大小的盒子/立方体/超立方体划分 n 维空间,并将粒子放置在相关的盒子内,以便可以进行优化的碰撞检查,这需要较少的比较,因为只有粒子位于相邻的盒子/立方体/超立方体中需要检查新粒子所在的位置。所有细节都已通过算法计算出来。
但是,使用“维度”等于所研究空间的 ndarray 似乎是个好主意。然后 ndarray 中的每个“点”本身将包含一个粒子对象数组。可以很容易地查看 ndarray 中存在于新粒子周围坐标中的对象,并循环遍历那些本身包含必须进行检查的其他粒子的数组中包含的数组。然后我发现 ndarray 只能包含固定大小的对象,而这些粒子数组则不然,因为它们随着粒子随机添加到系统而增长。
普通的 numpy 数组数组(等等)是否是唯一的解决方案,或者是否存在类似于 ndarray 但能够容纳可变大小对象的结构? Ndarray 看起来很棒,因为它是 numpy 的一部分,而 numpy 是用编译语言 c 编写的,因此速度很快。此外,ndarray不需要循环来构造,因为我相信数组的数组(等等...)会(注意:空间的维数和空间划分的增量不是恒定的,因为可以添加不同半径的粒子,意味着空间划分正方形/立方体/超立方体的大小发生变化。
速度在这个程序中非常重要,如果看到我发现的良好的算法优化被糟糕的实现所破坏,那将是一种耻辱!
最佳答案
您是否考虑过使用 kd 树来代替? kd 树支持通过分割空间来快速枚举点的邻居(就像您建议的多维数组一样)。
作为一个不错的奖励,SciPy(NumPy 的配套项目)中已经有了一个不错的 kd-tree 实现:scipy.spatial.KDTree
.
关于python - Numpy ndarray 包含可变大小的对象(对象数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28158242/