我试图将由(四面体)单元,它们的(三角形)面,边和节点组成的非结构化网格放入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 = ...
,并请他们在有需要时。这虽然看起来不太习惯。例如,循环遍历需要节点,面和边的单元格,每次都需要压缩三个数组。
有用的建议,任何人?
当你说“假设我稍后决定我想添加[fields]”时,你究竟担心什么?将字段添加到cells_dtype时,难以修改现有代码以匹配吗?转换之前以旧格式序列化的数据的难度?在同一程序中使用两种不同的dtypes作为细胞数据的困难? – Weeble 2012-02-21 12:49:28
哦,我的意思是我现在不怎么高效地添加字段。我当然可以继续创建一个扩展dtype的全新数组,并将旧条目一点一点地填满,但这似乎效率低下。 – 2012-02-21 13:15:51
我还是不太明白“效率”是什么意思。您是否正在讨论在运行时这样做,并且您担心复制阵列的CPU和内存成本,或者您是否在讨论编辑源文件充满数字的问题,并且担心编辑时间会让您编辑他们每当你改变你的存储结构?或者,您是否最感兴趣的是如何编写代码的其余部分,以便稍后添加或删除字段时可以最小化需要更改的代码量? – Weeble 2012-02-21 14:39:05