使用numpy在Python中导入nastran nodes deck

时间:2015-10-21 08:25:39

标签: python numpy nastran

如果我想将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

帮助表示赞赏。

P.S。有些人可以制作一个nastran标签,在nastran中完成大量的数据处理,这需要智能编程。这会有所帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

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.int64XYZ字段的类型为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])

答案 1 :(得分: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.}