使用 numpy 在 Python 中导入 nastran 节点平台
Import nastran nodes deck in Python using numpy
如果我想将 Nastran Deck 导入 Python 数组,使用 numpy 一下子就可以了。我该怎么办?我哪里错了?
我有一个文件,里面只有网格。网格均等距与 Nastran 的短翻译器(8 个字符)
$ MH Nodes
456784567845678456784567845678
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 中完成的,这需要智能编程。这会很有帮助。
dtype
指定二进制数据在内存中的布局。它没有定义文件中文本的格式。
您的数据文件具有固定宽度的字段。即每个字段使用八个字符,没有特殊的分隔符来分隔字段。您可以使用 numpy.genfromtxt
读取此类文件,方法是在 delimiter
参数中指定字段宽度。
这是 ipython 会话中的示例。首先,这是您的示例文件。 (我编辑了文件以确保在第二行和第三行的最后一个 05
之后有三个空格,但这不是必需的。)
In [15]: !cat nastran_data.txt
$ MH Nodes
456784567845678456784567845678
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])
也许 pyNastran 可以代替 numpy? 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.}
如果我想将 Nastran Deck 导入 Python 数组,使用 numpy 一下子就可以了。我该怎么办?我哪里错了?
我有一个文件,里面只有网格。网格均等距与 Nastran 的短翻译器(8 个字符)
$ MH Nodes
456784567845678456784567845678
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 中完成的,这需要智能编程。这会很有帮助。
dtype
指定二进制数据在内存中的布局。它没有定义文件中文本的格式。
您的数据文件具有固定宽度的字段。即每个字段使用八个字符,没有特殊的分隔符来分隔字段。您可以使用 numpy.genfromtxt
读取此类文件,方法是在 delimiter
参数中指定字段宽度。
这是 ipython 会话中的示例。首先,这是您的示例文件。 (我编辑了文件以确保在第二行和第三行的最后一个 05
之后有三个空格,但这不是必需的。)
In [15]: !cat nastran_data.txt
$ MH Nodes
456784567845678456784567845678
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])
也许 pyNastran 可以代替 numpy? 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.}