2

ASCII ファイルを Python に読み込む必要があります。ファイルの抜粋は次のようになります。

E     M S T   N...
...
9998  1 1 128 10097 10098 10199 10198 20298 20299 20400 20399
9999  1 1 128 10098 10099 10200 10199 20299 20300 20401 20400
10000 1 1 128 10099 10100 10201 10200 20300 20301 20402 20401
10001 1 2  44  2071  2172 12373 12272
10002 1 2  44  2172  2273 12474 12373

上記は、理想的には NumPy スキーマに従っている必要があります。

array([(9998, 1, 1, 128, (10097, 10098, 10199, 10198, 20298, 20299, 20400, 20399)),
       (9999, 1, 1, 128, (10098, 10099, 10200, 10199, 20299, 20300, 20401, 20400)),
       (10000, 1, 1, 128, (10099, 10100, 10201, 10200, 20300, 20301, 20402, 20401)),
       (10001, 1, 2, 44, (2071, 2172, 12373, 12272)),
       (10002, 1, 2, 44, (2172, 2273, 12474, 12373))], 
      dtype=[('E', '<i4'), ('M', '<i4'), ('S', '<i4'), ('T', '<i4'), ('N', '|O4')])

最後のオブジェクト はNtuple2 ~ 8 個の整数を持つ です。

np.loadtxtこの不規則な構造を または のいずれかを使用してロードしたいと思いますがnp.genfromtxt、これが可能かどうかはわかりません。組み込みのヒント、またはカスタムの分割キャスト for ループを実行する必要がありますか?

4

1 に答える 1

2

私の知る限り、ループのカスタム「スプリットキャスト」は必要です。

実際、NumPyはあなたのようなネストされた構造を読み取ることができますが、次のように固定された形状である必要があります。

numpy.loadtxt('data.txt', dtype=[ ('time', np.uint64), ('pos', [('x', np.float), ('y', np.float)]) ])

必要なdtypeを使用してデータを読み取ろうとすると、NumPyは各タプルの最初の数のみを読み取ります。

dt=[('E', '<i4'), ('M', '<i4'), ('S', '<i4'), ('T', '<i4'), ('N', '|O4')]
print numpy.loadtxt('data.txt', dtype=dt)

したがって、

[(9998, 1, 1, 128, '10097')
 (9999, 1, 1, 128, '10098')
 (10000, 1, 1, 128, '10099')…]

したがって、先に進んで、の代わりにforループを使用しますnumpy.loadtxt()

より高速な中間アプローチを使用することもできます。NumPyに上記のコードを使用してファイルをロードさせてから、「N」フィールドを手動で「修正」します。

dt=[('E', '<i4'), ('M', '<i4'), ('S', '<i4'), ('T', '<i4'), ('N', '|O4')]
arr = numpy.loadtxt('data.txt', dtype=dt)  # Correctly reads the first 4 columns

with open('data.txt') as input_file:
    for (line_num, line) in enumerate(input_file):
        arr[line_num]['N'] = tuple(int(x) for x in line.split()[4:])  # Manual setting of the tuple column

このアプローチは、forループで配列全体を解析するよりも高速な場合があります。これにより、必要な結果が得られます。

[(9998, 1, 1, 128, (10097, 10098, 10199, 10198, 20298, 20299, 20400, 20399))
 (9999, 1, 1, 128, (10098, 10099, 10200, 10199, 20299, 20300, 20401, 20400))
 (10000, 1, 1, 128, (10099, 10100, 10201, 10200, 20300, 20301, 20402, 20401))
 (10001, 1, 2, 44, (2071, 2172, 12373, 12272))
 (10002, 1, 2, 44, (2172, 2273, 12474, 1237))]
于 2011-04-14T09:33:06.627 に答える