0

Nastran Deck を Python Array にインポートしたい場合は、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

dtypeメモリ内のバイナリ データのレイアウトを指定します。ファイル内のテキストの形式は定義しません。

データ ファイルに固定幅フィールドがあります。つまり、各フィールドは 8 文字を使用し、フィールドを区切るための特別な区切り文字はありません。このようなファイルは、引数numpy.genfromtxtでフィールド幅を指定することにより、を使用して読み取ることができます。delimiter

これは ipython セッションの例です。まず、サンプル ファイルを次に示します。(ファイルを編集して05、2 行目と 3 行目の最後の行の後に 3 つのスペースがあることを確認しましたが、これは必要ありませんでした。)

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フィールドには typenp.int64があり、XYおよびZフィールドには type があることに注意してください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 の 6 つの固定幅フィールドで、 を使用してファイルを読み取ります。

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 に答える