1

HDF5 ファイルからデータを読み込み、特定のデータ セットを選択し、サブセットごとに計算を行う小さなモジュールを実装したいと考えています。サブセットの選択に argparse オプションを使用することにしました。文字列を使用して手動で解析するよりも良い方法はありますか?

以下のコードは私が望むことを行うはずですが、あまりきれいではなく、「:-3」などの入力をまだ処理できません。もっと良い方法があるはずです!

ありがとう!

parser.add_argument('--filename', required=True, 
               help='the file to open')
parser.add_argument('--snapshots', default="-1", type=str, 
               help="select snapshots (default: %(default)s) ")
[...]
H5 = tables.openFile(filename)

snapshot = args.snapshots
maxval = len(H5.root.trajectory[:])
if snapshot ==":" or snapshot.lower() == "all":
    snapshot = np.arange(maxval)
elif ':' in snapshot:
    if snapshot.index(':') == 0:
        snapshot = np.arange(int(snapshot[1:]))
    elif snapshot.index(':') == len(snapshot) - 1:
        snapshot = np.arange(int(snapshot[:-1]),maxval)
    else:
        from_to = snapshot.split(':')
        snapshot = np.arange(int(from_to[0]), int(from_to[1]))
else:
    snapshot = int(snapshot)
selected = H5.root.trajectory[snapshot]
4

1 に答える 1

0

私も文字列を解析する傾向がありますが、を利用sliceしてスライスを取得します。

更新されました(以下のコメントを参照)

次の行に沿ったもの::

def parsesection(snapshot):
    if snapshot == 'all':
        return slice(None)
    try:
        section = int(snapshot)
    except ValueError:
        section = [int(s) if s else None for s in snapshot.split(':')]
        if len(section) > 3:
            raise ValueError('snapshots input incorrect')
        section = slice(*section)
    return section

print(parsesection(':5'))
print(parsesection('5:15'))
print(parsesection('5:15:3'))
print(parsesection('3'))
print(parsesection('5::3'))
print(parsesection('::2'))
print(parsesection('all'))

結果:

slice(None, 5, None)
slice(5, 15, None)
slice(5, 15, 3)
3
slice(5, None, 3)
slice(None, None, 2)
slice(None, None, None)

はトリックのsection = slice(*section)ように感じるかもしれませんが、注意深く見れば、理解するのは難しいことではありません (主に ifif elif elsesection.

これは、多次元インデックスでは機能しません。その場合、最初にコンマで分割します。また、省略記号を許可する場合は、3 つのドットを個別にキャッチし、スライスの代わりに Ellipsis オブジェクトを返す必要があります。

于 2013-09-05T09:29:58.460 に答える