如果我想将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中完成大量的数据处理,这需要智能编程。这会有所帮助。
答案 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.int64
,X
,Y
和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])
答案 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.}