2012-02-21 66 views
2

我试图将由(四面体)单元,它们的(三角形)面,边和节点组成的非结构化网格放入Python数据结构中,该结构既直观又高效。 数据结构需要能够回答的问题是“节点k的坐标是什么?”,“单元格j中的哪些边?”,“哪个单元格与我相邻?”等等。扩展dtypes?列表和关系的最佳数据结构?

我的第一个猜测是去像

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 = ... 

,并请他们在有需要时。这虽然看起来不太习惯。例如,循环遍历需要节点,面和边的单元格,每次都需要压缩三个数组。

有用的建议,任何人?

+0

当你说“假设我稍后决定我想添加[fields]”时,你究竟担心什么?将字段添加到cells_dtype时,难以修改现有代码以匹配吗?转换之前以旧格式序列化的数据的难度?在同一程序中使用两种不同的dtypes作为细胞数据的困难? – Weeble 2012-02-21 12:49:28

+0

哦,我的意思是我现在不怎么高效地添加字段。我当然可以继续创建一个扩展dtype的全新数组,并将旧条目一点一点地填满,但这似乎效率低下。 – 2012-02-21 13:15:51

+0

我还是不太明白“效率”是什么意思。您是否正在讨论在运行时这样做,并且您担心复制阵列的CPU和内存成本,或者您是否在讨论编辑源文件充满数字的问题,并且担心编辑时间会让您编辑他们每当你改变你的存储结构?或者,您是否最感兴趣的是如何编写代码的其余部分,以便稍后添加或删除字段时可以最小化需要更改的代码量? – Weeble 2012-02-21 14:39:05

回答

0

首先,我会说我不是一个真正的裸体专家。我认为虽然可能没有办法做你所描述的事情,但它可能不像你想象的那么大。

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

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

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

  3. 当您需要添加字段时,用不同的dtype重新分配。虽然这涉及到复制,但是您是否经常这样做,使复制的成本成为问题?复制numpy数组非常快,当然与Python对于相同数据的循环相比。

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