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

时间:2012-02-21 11:36:54

标签: python arrays numpy user-defined-types

我正在尝试将由(四面体)单元,它们(三角形)面,边和节点组成的非结构化网格拟合到一个既直观又高效的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中的节点。

目前我可以看到一个缺点: 阵列不可扩展。假设我稍后在运行时决定要添加有关面和边的信息;如何在不移动数据的情况下向字符串数组添加字段,即如何动态扩展数组的dtypes?

解决方法是创建单独的数组,例如

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

并在必要时填写它们。这似乎不是很惯用。例如,循环遍历需要节点,面和边的单元格,每次都需要压缩三个数组。

有用的建议,有人吗?

1 个答案:

答案 0 :(得分:0)

首先,我会说我不是一个笨拙的专家。我认为虽然可能没有办法按照你的描述进行,但它可能不像你想象的那么大。

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

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

  2. 对所有单元格使用相同的dtype,并在不使用时忽略这些字段。浪费一些记忆,但很容易。如果可能的话,

  3. 需要添加字段时,使用其他dtype重新分配。虽然这涉及复制,你是否经常这样做,因为副本的成本是一个问题?复制numpy数组非常快,当然与Python'for'相同数据的循环相比。

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