2

研究室での実験で統計を行うために、Octave の代わりに SciPy スイートを試してみたいと思います。私の質問のほとんどはここで答えられましたが、もう1つだけ残っています:

私は通常、測定値にエラーが添付されています.Octaveでは、次のことを行いました:

R.val = 10;
R.err = 0.1;

U.val = 4;
U.err = 0.1;

そして、私はそれを次Iのように計算します:

I.val = U.val / R.val;
I.err = sqrt(
    (1 / R.val * U.err)^2
    + (U.val / R.val^2 * R.err)^2
);

大量の測定値があるときは、通常、次のような構造体配列を使用しました。

R(0).val = 1;
R(0).err = 0.1;
…
R(15).val = 100;
R(15).err = 9;

次にR(0).val、使用してそれらすべてを実行または直接アクセスすることができ、たとえばR.val、すべての値を持つ列ベクトルがありました。mean(R.val)

SciPy/NumPy/Python を使用してこれをどのように表現できますか?

4

4 に答える 4

2

最も簡単なのは、NumPy構造化配列を使用することです。これにより、他の同種要素(フィールド)で構成される同種要素(レコード)の配列を定義できます。

たとえば、次のように定義できます

R = np.empty(15, dtype=[('val',float),('err',float)])

次に、対応する列に入力します。

R['val'] = ...
R['err'] = ...

valまたは、とerrが2つのリストにある場合は、配列を一度に定義できます。

R = np.array(zip(val_list, err_list), dtype=[('val',float),('err',float)])

どちらの場合も、インデックスR[0](特定のオブジェクト、anp.voidを提供し、フィールドに個別にアクセスする可能性を提供します)またはスライスによって個々の要素にアクセスできますR[1:-1]...

あなたの例では、次のことができます。

I = np.empty_like(R)
I['val'] = U['val'] / R['val']
I['err'] = np.sqrt((1 / R['val'] * U['err'])**2 + (U['val'] / R['val']**2 * R['err'])**2)

レコード配列を使用することもできます。これは、__getattr__およびメソッドがオーバーロードされた基本的な構造化配列であり、__setattr__属性(のようにR.val)およびインデックス(標準のように)としてフィールドにアクセスできますR['val']。もちろん、これらの基本的なメソッドはオーバーロードされているため、レコード配列は構造化配列ほど効率的ではありません。

于 2012-09-10T20:13:25.457 に答える
1

たった1回の測定では、おそらく単純なnamedtupleで十分です。

また、構造体配列の代わりに、numpyのレコード配列を使用できます。しかし、もう少し一口になっているようです。

また、Matlabユーザー向けのNumPyのグーグルキャッシュ(直接リンクは私には機能しません)は、基本的な操作のいくつかの対応物に役立ちます。

于 2012-09-10T12:53:33.547 に答える
0

Python で不確実性とともに数量を表すためのパッケージがあります。それはと呼ばれます!(PyPIでも)。

于 2012-09-10T16:02:11.103 に答える