1

モンテカルロ シミュレーションでは、各実行の概要をデータ ファイルに保存します。各列には、パラメーターまたは結果値のいずれかが含まれます。そのため、最終的には最大 40 列のデータが格納される大きなデータ ファイルになり、多くの行は他の行とは何の関係もありません。

たとえば、このファイルは次のようになります。

#param1    param2    result1    result2
1.0        1.0       3.14       6.28
1.0        2.0       6.28       12.56
...
2.0        1.0       1.14       2.28
2.0        2.0       2.28       4.56

結果の 1 つがパラメーターの 1 つに依存することをよく調べたいので、2 番目のパラメーターでグループ化し、1 番目のパラメーターで並べ替える必要があります。また、パラメータに応じて行を除外することもできます。

このために独自のクラスを書き始めましたが、想像以上に難しいようです。今私の質問:これを既に行っているライブラリはありますか? それとも、私は SQL に精通しているので、たとえば、SQLAlchemy の SQL バックエンドを作成して、データに対して単純な SQL クエリを実行できるようにするのは難しいでしょうか? 私の知る限り、これは私が必要とするすべてを提供します。


cravooriの回答(または少なくとも彼/彼女が投稿したリンクの回答)に基づいて、ここに私の問題に対する素敵で短い解決策があります:

#!/usr/bin/python2

import numpy as np
import sqlite3 as sql

# number of columns to read in
COLUMNS = 31

# read the file. My columns are always 18chars long. the first line are the names
data = np.genfromtxt('compare.dat',dtype=None,delimiter=18, autostrip=True,
                     names=True, usecols=range(COLUMNS), comments=None)

# connect to the database in memory
con = sql.connect(":memory:")

# create the table 'data' according to the column names
con.execute("create table data({0})".format(",".join(data.dtype.names)))

# insert the data into the table
con.executemany("insert into data values (%s)" % ",".join(['?']*COLUMNS),
                data.tolist())

# make some query and create a numpy array from the result
res = np.array(con.execute("select DOS_Exponent,Temperature,Mobility from data ORDER \
    BY DOS_Exponent,Temperature ASC").fetchall())

print res
4

3 に答える 3

2

データが区切られていることを確認すると、1 つのオプションは、csv モジュールを介してメモリ内 SQLite データベースにファイルをインポートすることです。以下にリンクされている例を参照してください。Sqlite はほとんどの SQL 句をサポートします

データを SQLite db にインポートする

于 2012-07-30T17:20:07.217 に答える
0

単純な計算のみが必要であると仮定すると、コード内アプローチは次のようになります。

file = open('list_filter_data.txt', mode='r')
lines = file.read().splitlines()
row_sets = [[float(c) for c in line.split()] for line in lines[1:]] # read and split the lines in the columns

# get only rows whose param1 = 1.0
subset = [row for row in row_sets if row[0] == 1.0]
print subset
# get only rows whose param1 = 2.0
subset = [row for row in row_sets if row[0] == 2.0]
print subset
# average result1 where param2 = 2.0
avg = sum([row[2] for row in row_sets if row[1] == 2.0]) / len([row[2] for row in row_sets if row[1] == 2.0])
print avg
于 2012-07-30T17:02:11.077 に答える
0

ファイル サイズが数 MB 程度の場合、このインメモリを簡単に読み取り、他の回答を使用して解決できます。

ファイル サイズが数百 MB または数 GB の場合は、ここで説明されているような遅延読み込み方法を使用することをお勧めします - Python で大きなファイルを読み取るための遅延方法?

実行しようとしている計算が行ごとに実行できる場合、これらの小さなチャンクは、必要なことを実行するのに十分なはずです。

それ以外の場合は、params と結果の間のすべてが 1 対 1 の関係であると仮定して、params と結果の列 C1、C2、..CN を持つ SQL テーブルを作成します。Python データベース アクセス API を使用して、SQL ステートメントを記述し、必要なものを分析するだけです。

一方、Excel スプレッドシートでも問題が解決する場合があります。

于 2012-07-30T17:26:36.237 に答える