扩展数据类型?列表和关系的最佳数据结构



我正在尝试将一个由(四面体)单元、它们的(三角形)面、边和节点组成的非结构化网格拟合到一个既直观又高效的Python数据结构中。数据结构需要能够回答的问题是"节点k的坐标是多少?"、"哪些边在单元格j中?"、"哪些单元格与面i相邻?"等等。

我的第一个猜测是像一样

nodes_coords = np.array(num_nodes, dtype=np.dtype((float,3)))
cells_dtype = np.dtype([('nodes', (int,4))])
cells = np.array(num_cells, dtype=cells_dtype)

等等。这样做的好处是,有一种非常直观的方法来获得小区节点关系,即

cells[4]['nodes']

将为您提供单元#4中的节点。

我现在可以看到这样做的一个缺点:阵列不可扩展。假设我稍后在运行时决定添加关于面和边的信息;如何在不移动数据的情况下向单元格数组中添加字段,即如何动态扩展数组的数据类型?

解决办法是创建单独的阵列,如

cells_nodes = ...
cells_faces = ...
cells_edges = ...

并在必要时填充。不过这似乎不太地道。例如,在需要节点、面和边的单元上循环,每次都需要压缩三个数组。

有用的建议,有人吗?

首先,我要说我并不是一个真正的傻瓜专家。我认为,虽然可能没有办法做到你所描述的,但这可能并不像你想象的那么大。

正如您所描述的,您希望添加字段,但希望避免移动数据。我认为这是不可能的。您的选择是:

  1. 也许您提前知道哪些网格需要额外的字段?如果是这样的话,你可以提前分配它们,并仔细编写算法,忽略它们不需要操作的字段,这样无论数组中存在哪些额外的字段,它们都可以使用。

  2. 只需对所有单元格使用相同的dtype,并在不使用字段时忽略它们。浪费一些内存,但很容易。如果可能,

  3. 当需要添加字段时,使用不同的数据类型重新定位。虽然这涉及到复制,但您这样做的频率是否足以使复制成本成为一个问题?复制numpy数组非常快,当然与Python在相同数据上的"for"循环相比。

  4. 正如您所建议的,为每个字段保留单独的简单数组。虽然这可能涉及到对基于Python的循环进行压缩,但这可能不是对它们执行的主要处理类型,是吗?如果在Python for循环中主要在numpy数组上循环,那么您可能不会从numpy中获得太多好处。

最新更新