【发布时间】:2012-02-21 11:36:54
【问题描述】:
我正在尝试将由(四面体)单元、它们的(三角形)面、边和节点组成的非结构化网格拟合到既直观又高效的 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 = ...
并在必要时填写它们。不过,这似乎不是很地道。例如,在需要节点、面和边的单元格上循环,每次都需要压缩三个数组。
有用的建议,有人吗?
【问题讨论】:
-
当您说“假设我稍后决定要添加[字段]”时,您担心的究竟是什么?将字段添加到 cells_dtype 时,难以修改现有代码以匹配?转换以前以旧格式序列化的数据有困难吗?在同一个程序中对单元格数据使用两种不同的 dtype 有困难吗?
-
哦,我的意思是我现在不知道如何有效地添加字段。我当然可以继续创建一个具有扩展 dtype 的全新数组,然后一点一点地填充旧条目,但这似乎效率低下。
-
我还是不太明白你所说的“效率”是什么意思。您是在谈论在运行时执行此操作,并且担心复制数组的 CPU 和内存成本,还是您在谈论编辑充满数字的源文件而担心编辑所需的时间每次更改存储结构时它们?或者您最感兴趣的是如何编写其余代码,以便在以后添加或删除字段时尽量减少需要更改的代码量?
-
现在我理解了这个误解:我的意思不是“以后的生活”,而是“以后的运行时间”。该结构通常仅使用节点和单元创建,并且可以根据需要添加边/面。例如,我担心将边缘/面部信息添加到现有单元阵列的内存和 CPU 成本。
标签: python arrays numpy user-defined-types