0

次の順序(タブ区切り)のファイルがたくさんあります。

h   local   average
1   4654    4654
2   5564    5564
3   6846    6846
... ...     ...

ファイルをループで読み取り (以下に添付)、2 次元リストに保存します。次に、リストを配列に変換し、std を適用します。これにより、次の結果が得られます。

Traceback (most recent call last):
  File "plot2.py", line 56, in <module>
    e0028 = np.std(ar, axis=0)
  File "/usr/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2467, in std
    return std(axis, dtype, out, ddof)
TypeError: unsupported operand type(s) for /: 'list' and 'float'

それは私を困惑させます。float ではなく、何もポップされない配列内の要素を見つけようとしました。

import numpy as np
import matplotlib.pyplot as plt
from math import fabs, sqrt, pow, pi

h0028 = []  
p0028 = []

headLines = 2

fig=plt.figure()  
ax1 = fig.add_subplot(1,1,1)  
for i in range (0,24):  

    n = 0  
    j = i + 560  
    p = []  
    f = open('0028/'+str(j)+'.0028/ionsDist.dat')  
    for line in f:  
        if n < headLines:  
            n += 1  
            continue  
        words = line.split()  
        p.append (float(words[1]))  
        if i == 0:  
            h0028.append (fabs(int(words[0])))  
        n += 1  
    print (n)  
    p0028.append(p)  
    f.close()  

ar = np.array(p0028)  
for a in ar:  
    for b in a:  
        if not isinstance(b,float):  
            print type(a)  

e0028 = np.std(ar, axis=0)  
p0028 = np.mean(ar, axis=0)  
h0028 = np.array(h0028)/10 -2.6  
p0028 /= max(p0028)  
e0028 /= (sum(p0028)*sqrt(23))  

ax1.errorbar(h0028 , p0028, yerr=e0028, color = 'red')  
ax1.set_xlim(-0.1,10)  

plt.show()  
plt.savefig('plot2.png', format='png')  
4

2 に答える 2

1

コードが機能しない理由はわかりませんが、これが役立つかもしれません。次のようにファイルを読み取ることができます。

    >>>a = np.loadtxt("p0028.csv",dtype="float",skiprows = 1)
    >>> a
    array([[  1.00000000e+00,   4.65400000e+03,   4.65400000e+03],
    [  2.00000000e+00,   5.56400000e+03,   5.56400000e+03],
    [  3.00000000e+00,   6.84600000e+03,   6.84600000e+03]])

これで、たとえば次のようにローカル列の std を取得できます。

    >>>a_std = np.std(a[:1])
    2193.4452352406706

複数のファイルをループする場合、vstack メソッドを使用してデータをまとめて収集できます。これにより、ファイル内の行数に依存しなくなります。

    >>>a = np.loadtxt("p0028.csv",dtype="float",skiprows = 1)
    >>> a
    array([[  1.00000000e+00,   4.65400000e+03,   4.65400000e+03],
    [  2.00000000e+00,   5.56400000e+03,   5.56400000e+03],
    [  3.00000000e+00,   6.84600000e+03,   6.84600000e+03]])
    >>>b = np.loadtxt("p0028.csv",dtype="float",skiprows = 1)
    >>> np.vstack((a,b))
    array([[   1, 4654, 4654],
    [   2, 5564, 5564],
    [   3, 6846, 6846],
    [   1, 4654, 4654],
    [   2, 5564, 5564],
    [   3, 6846, 6846]])
于 2012-05-15T08:24:15.203 に答える
1

エラーが見つかりました。私のファイルはすべて同じ長さではありませんでした。これにより、空の要素にアクセスする状況が発生しました。同じ長さになるまで、各リストの最後にゼロを追加するループを追加しました。Schuh 氏は、最後にゼロを追加すると std が間違ってしまう可能性があると指摘しました。これは私のデータには当てはまりませんが、注意が必要です。

于 2012-05-16T06:21:13.347 に答える