Numpy ndarray 包含可变大小的对象(对象数组)

Numpy ndarray containing objects of variable size (arrays of objects)

晚上好,

我目前正在进行大学一年级的项目,以模拟连续渗滤。这涉及在 n 维 space 中将一些 discs/spheres/hyperspheres 随机分布在 square/cube/hypercube 上,并找到跨越边界的连接粒子簇。

为了加快所有这些粒子之间本质上的碰撞检测以将它们分组到连接的簇中,我决定使用空间分区,这样我的程序就可以很好地适应粒子数量。这需要我将 n 维 space 划分为大小均匀的 boxes/cubes/hypercubes 并将粒子放入相关框内,以便可以进行优化的碰撞检查,这需要较少的比较,因为只有粒子位于 boxes/cubes/hypercubes 与新粒子所在的位置相邻需要检查。所有细节都已通过算法计算出来。

但是,使用 "dimension" 等于正在研究的 space 的 ndarray 似乎是个好主意。然后 ndarray 中的每个 "point" 本身将包含一个粒子对象数组。很容易查看 ndarray 中存在于新粒子坐标周围的对象,并循环浏览那些本身包含必须对其进行检查的其他粒子的数组中包含的数组。然后我发现 ndarray 只能包含固定大小的对象,这些粒子阵列不是,因为它们随着粒子随机添加到系统中而增长。

数组的数组(等等)的普通 numpy 数组是否是唯一的解决方案,或者是否存在类似于 ndarray 但能够容纳可变大小对象的结构? Ndarray 看起来很棒,因为它是用编译语言 c 编写的 numpy 的一部分,所以它会很快。此外,ndarray 不需要循环构建,因为我相信数组的数组(等...)会(注意:space 的维数和空间划分的增量不是恒定的,因为不同半径的粒子可以添加,意味着空间划分大小的变化squares/cubes/hypercubes).

速度在这个程序中非常重要,如果看到我发现的算法上好的优化被糟糕的实现毁掉,那将是一种耻辱!

您是否考虑过改用 kd 树? kd-trees 支持通过拆分 space 来快速枚举一个点的邻居(就像你建议的多维数组一样)。

作为一个不错的奖励,SciPy 中已经有一个不错的 kd-tree 实现,它是 NumPy 的配套项目:scipy.spatial.KDTree.