0

如果我想将 Nastran Deck 导入 Python 数组,一举使用 numpy。我该怎么办?我哪里错了?

我有一个文件,里面只有网格。网格均使用 Nastran 的短翻译器(8 个字符)等间距

$ MH Nodes
$2345678$2345678$2345678$2345678$2345678$2345678
GRID     25601          58.50002-57.749923.05                      
GRID     25602          58.81002-57.749923.05  

如果我理解正确,使用 Numpy 的 dtype 命令会很棒。这是我的代码:

fileMH = "Gnodes.bdf"

dtyp = np.dtype([
                ("Grid",(np.void,8)),
                ("GN",(np.int,8)),
                ("Prop",(np.void,8)),
                ("X",(np.float,8)),
                ("Y",(np.float,8)),
                ("Z",(np.float,8)),
])

f = np.loadtxt(fileMH,dtyp,comments="$")

我得到的错误是一个浮点错误,但是我期望 dtype 一次从字符串中提取 8 个字符。这是错误:

ValueError: invalid literal for float(): 58.50002-57.749923.05

帮助表示赞赏。

PS 能否请一些人制作一个 nastran 标签,大量数据处理是在 nastran 中完成的,这需要智能编程。这会很有帮助。

4

2 回答 2

2

而不是 numpy,也许 pyNastran 会起作用?https://github.com/SteveDoyle2/pyNastran

这个例子打印节点

import pyNastran
from pyNastran.bdf.bdf import BDF
model = BDF()
model.read_bdf('inputdeck.bdf', xref=True)
model.nodes
{1: GRID           1              8.      3.      0.,
 2: GRID           2              8.      9.      0.,
 3: GRID           3              8.     11.      0.,
 4: GRID           4              8.     13.      0.,
 5: GRID           5             -8.      3.      0.,
 6: GRID           6             -8.      9.      0.,
 7: GRID           7             -8.     11.      0.,
 8: GRID           8             -8.     13.      0.,
 9: GRID           9              2.      5.      0.}
于 2017-08-27T01:01:37.260 回答
2

指定内存中二进制数据的dtype布局。它没有定义文件中文本的格式。

您的数据文件具有固定宽度的字段。也就是说,每个字段使用八个字符,并且没有特殊的分隔符来分隔字段。您可以使用 , 通过在参数numpy.genfromtxt中指定字段宽度来读取此类文件。delimiter

这是 ipython 会话中的一个示例。首先,这是您的示例文件。(我编辑了文件以确保05在第二行和第三行的 final 之后有三个空格,但这不是必需的。)

In [15]: !cat nastran_data.txt
$ MH Nodes
$2345678$2345678$2345678$2345678$2345678$2345678
GRID     25601          58.50002-57.749923.05   
GRID     25602          58.81002-57.749923.05   

这是要创建的数组的数据类型genfromtxt。请注意,该GN字段具有类型np.int64,而XY字段Z具有类型np.float64

In [16]: dt = np.dtype([('Grid', 'S8'), ('GN', np.int64), ('Prop', 'S8'), ('X', np.float64), ('Y', np.float64), ('Z', np.float64)])

使用 读取文件genfromtxt,具有六个固定宽度的字段,每个字段的长度为 8:

In [18]: a = np.genfromtxt('nastran_data.txt', dtype=dt, delimiter=(8, 8, 8, 8, 8, 8), skip_header=2)

In [19]: a
Out[19]: 
array([('GRID    ', 25601, '        ', 58.50002, -57.7499, 23.05),
       ('GRID    ', 25602, '        ', 58.81002, -57.7499, 23.05)], 
      dtype=[('Grid', 'S8'), ('GN', '<i8'), ('Prop', 'S8'), ('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')])

In [20]: a['GN']
Out[20]: array([25601, 25602])

In [21]: a['X']
Out[21]: array([ 58.50002,  58.81002])
于 2015-10-21T08:55:46.547 回答