【发布时间】:2017-01-13 18:50:44
【问题描述】:
我维护a little Python package,它在用于网格表示的不同格式之间进行转换 à la
这些文件可能会变得非常大,因此在使用 Python 读取它们时,高效地读取它们很重要。
最常用的格式之一是来自Gmsh 的msh。不幸的是,它的数据布局可以说不是最好的。示例文件:
$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
8
1 -0.5 -0.5 -0.5
2 0.5 -0.5 -0.5
3 -0.5 0.5 -0.5
4 0.5 0.5 -0.5
5 -0.5 -0.5 0.5
6 0.5 -0.5 0.5
7 -0.5 0.5 0.5
8 0.5 0.5 0.5
$EndNodes
$Elements
2
1 4 2 1 11 1 2 3 5
2 4 2 1 11 2 5 6 8
$EndElements
-
对于
$Nodes:第一个数字 (
8) 是要跟随的节点数。在每个节点行中,第一个数字是索引(实际上仍有部分格式不需要,呃),然后跟随三个空间坐标。
到目前为止,我还没有在
for循环中找到比islices 更好的方法,这很慢。
# The first line is the number of nodes
line = next(islice(f, 1))
num_nodes = int(line)
#
points = numpy.empty((num_nodes, 3))
for k, line in enumerate(islice(f, num_nodes)):
points[k, :] = numpy.array(line.split(), dtype=float)[1:]
line = next(islice(f, 1))
assert line.strip() == '$EndNodes'
-
对于
$Elements:第一个数字 (
2) 是后面的元素数。在每个元素行中,第一个数字是索引,然后是元素类型的枚举(
4是四面体)。然后是该元素的整数标签数(此处每种情况下为2,即1和11)。对应于元素类型,该行中的最后几个条目对应于构成元素的$Node索引 - 对于四面体,最后四个条目。由于标签的数量可能因元素而异(即,行到行),就像元素类型和节点索引的数量一样,每行可能有不同数量的整数。
对于$Nodes 和$Elements,我们非常感谢您对快速读取这些数据的任何帮助。
【问题讨论】: