使用 DataFrames 排序和排列特定网格数据的更好方法

A better way for sorting and arranging specific mesh data using DataFrames

我目前正在使用特定的 FEM 软件。 post-处理工具已经过时了,它只能在专用机器上运行。我想在我自己的笔记本电脑上使用软件生成的结果文件可视化一些结果(为了更好地展示)。我将 Pandas 库与 Python.

一起使用

我能够达到我有两个不同的 DataFrame 的地步,一个具有元素 ID 和构造它的节点,第二个具有节点 ID 和 x、y 坐标 -

elementDF - includes {index, element ID, node1, node2, node3} # elements have 3 nodes
coordsDF - includes {index, node ID, x, y}

我能够将两者组合成一个 DataFrame -

df - includes {index, element ID, x1, y1, x2, y2, x3, y3} # where x1 and y1 are the
                                                            coordinates of node1, etc

稍后我将使用此 DataFrame 构建多边形并可视化网格。

问题是,我相信我使用了一个非常昂贵的循环来通过其 ID 搜索每个节点,提取 x 和 y 坐标,然后组合所有内容。我知道这一点是因为专用的 post-processing 程序可以在几秒钟内完成(对于大型网格 - 10,000 个或更多元素),而我的处理相同数量的元素大约需要 40~60 秒。我想知道是否有更快更有效的方法来构建最终的DataFrame。

示例输入数据帧:

elementDF = pd.DataFrame({
    'element': [1,2,3,4,5,6,7,8,9,10],
    'node1': [2,33,33,32,183,183,183,185,185,36],
    'node2': [34,34,183,183,34,35,185,35,36,37],
    'node3': [33,183,32,184,35,185,186,36,187,187]
    })

coordsDF = pd.DataFrame({
    'node': [2,32,33,34,35,36,37,183,184,185,186,187],
    'x': [-1, 1, 1, -1, -1.1, 1.1, 1.1, -1.1, -1.1, 1.1, 2, 2.2],
    'y': [0,0,2,2,-0.2,-0.2,0,0,2,2, 4, 4.4]
    })

示例代码:

import pandas as pd

def extractXY(nodeNumber,df):
   # extract x,y data from node location
   nodeData = df.loc[df['node'] == nodeNumber]
   x = nodeData.x
   y = nodeData.y

return x, y

#main#

df = pd.DataFrame(columns = ['x1','y1','x2','y2','x3','y3'])
for i in range(len(elementDF)):
    nodeNumber1 = elementDF.loc[i].node1
    x1, y1 = extractXY(nodeNumber1, coordsDF)

    nodeNumber2 = elementDF.loc[i].node2
    x2, y2 = extractXY(nodeNumber2, coordsDF)

    nodeNumber3 = elementDF.loc[i].node3
    x3, y3 = extractXY(nodeNumber3, coordsDF)
    
    df = df.append({'x1': float(x1), 'y1': float(y1),
                    'x2': float(x2), 'y2': float(y2) ,
                    'x3': float(x3), 'y3': float(y3)}, ignore_index = True)


df = pd.concat([elementDF['element'],df], axis = 1)

让我们试试这个:

import pandas as pd
elementDF = pd.DataFrame({
    'element': [1,2,3,4,5,6,7,8,9,10],
    'node1': [2,33,33,32,183,183,183,185,185,36],
    'node2': [34,34,183,183,34,35,185,35,36,37],
    'node3': [33,183,32,184,35,185,186,36,187,187]
    })

coordsDF = pd.DataFrame({
    'node': [2,32,33,34,35,36,37,183,184,185,186,187],
    'x': [-1, 1, 1, -1, -1.1, 1.1, 1.1, -1.1, -1.1, 1.1, 2, 2.2],
    'y': [0,0,2,2,-0.2,-0.2,0,0,2,2, 4, 4.4]
    })
mapx = coordsDF.set_index('node')['x']
mapy = coordsDF.set_index('node')['y']

df = pd.concat([
elementDF.set_index('element').replace(mapx).rename(columns=lambda x: x.replace('node','x')),
elementDF.set_index('element').replace(mapy).rename(columns=lambda y: y.replace('node','y')),
],
axis=1)
df

输出:

          x1   x2   x3   y1   y2   y3
element                              
1       -1.0 -1.0  1.0  0.0  2.0  2.0
2        1.0 -1.0 -1.1  2.0  2.0  0.0
3        1.0 -1.1  1.0  2.0  0.0  0.0
4        1.0 -1.1 -1.1  0.0  0.0  2.0
5       -1.1 -1.0 -1.1  0.0  2.0 -0.2
6       -1.1 -1.1  1.1  0.0 -0.2  2.0
7       -1.1  1.1  2.0  0.0  2.0  4.0
8        1.1 -1.1  1.1  2.0 -0.2 -0.2
9        1.1  1.1  2.2  2.0 -0.2  4.4
10       1.1  1.1  2.2 -0.2  0.0  4.4