3

私が使用しているサンプリングレートとそれがカウントしているもののためにノイズの多いプロットを滑らかにしようとしています。ここでヘルプを使用してきました-主にPyPlotで滑らかな線をプロットします(ただし、「スプライン」関数が見つからなかったため、UnivarinteSpline代わりに使用しています)

ただし、私が何をしても、pyplotエラー"x and y are not of the same length"またはそのscipi.UnivariateSplinewが正しくないというエラーが発生し続けます。これを修正する方法がよくわかりません(実際にはPythonの人ではありません!)問題を引き起こしているのは最後のプロットビットだけですが、コードを添付しました。ありがとう

import os.path
import matplotlib.pyplot as plt
import scipy.interpolate as sci
import numpy as np
def main():
    jcc = "0050"
    dj = "005"
    l = "060"
    D = 20
    hT = 4 * D
    wT1 = 2 * D
    wT2 = 5 * D
    for jcm in ["025","030","035","040","045","050","055","060"]:
        characteristic = "LeadersOnly/Jcm" + jcm + "/Jcc" + jcc + "/dJ" + dj + "/lambda" + l + "/Seed000"
        fingertime1 = []
        fingertime2 = []
        stamp =[]
        finger=[]
        for x in range(0,2500,50):
            if x<10000:
                z=("00"+str(x))
            if x<1000:
                z=("000"+str(x))
            if x<100:
                z=("0000"+str(x))
            if x<10:
                z=("00000"+str(x))
            stamp.append(x)
            path = "LeadersOnly/Jcm" + jcm + "/Jcc" + jcc + "/dJ" + dj + "/lambda" + l + "/Seed000/profile_" + str(z) + ".txt"
            if os.path.exists(path):
                f = open(path, 'r')
                pr1,pr2=np.genfromtxt(path, delimiter='\t', unpack=True)
                p1=[]
                p2=[]
                h1=[]
                h2=[]
                a1=[]
                a2=[]
                finger1 = 0
                finger2 = 0
                for b in range(len(pr1)):
                    p1.append(pr1[b])
                    p2.append(pr2[b])
                for elem in range(len(pr1)-80):
                    h1.append((p1[elem + (2*D)]-0.5*(p1[elem]+p1[elem + (4*D)])))
                    h2.append((p2[elem + (2*D)]-0.5*(p2[elem]+p2[elem + (4*D)])))
                    if h1[elem] >= hT:
                        a1.append(1)
                    else:
                        a1.append(0)
                    if h2[elem]>=hT:        
                        a2.append(1)
                    else:
                        a2.append(0)
                for elem in range(len(a1)-1):
                    if (a1[elem] - a1[elem + 1]) != 0:
                        finger1 = finger1 + 1
                finger1 = finger1 / 2
                for elem in range(len(a2)-1):
                    if (a2[elem] - a2[elem + 1]) != 0:
                        finger2 = finger2 + 1
                finger2 = finger2 / 2
                fingertime1.append(finger1)
                fingertime2.append(finger2)
                finger.append((finger1+finger2)/2)
        namegraph = jcm
        stampnew = np.linspace(stamp[0],stamp[-1],300)
        fingernew = sci.UnivariateSpline(stamp, finger, stampnew)
        plt.plot(stampnew,fingernew,label=namegraph)
    plt.show()      

main()

参考までに、データ入力ファイルは単なる整数のリストです (コードが示すように、タブで区切られた 2 つのリスト)。

これは私が得るエラーコードの1つです:

0-th dimension must be fixed to 50 but got 300

error                                     Traceback (most recent call last)

/group/data/Cara/JCMMOTFingers/fingercount_jcm_smooth.py in <module>()
    116
    117 if __name__ == '__main__':
--> 118     main()
    119
    120

/group/data/Cara/JCMMOTFingers/fingercount_jcm_smooth.py in main()
     93                 #print(len(stamp))
     94                 stampnew = np.linspace(stamp[0],stamp[-1],300)
---> 95                 fingernew = sci.UnivariateSpline(stamp, finger, stampnew)
     96                 #print(len(stampnew))
     97                 #print(len(fingernew))

/usr/lib/python2.6/dist-packages/scipy/interpolate/fitpack2.pyc in __init__(self, x, y, w, bbox, k, s)
     86         #_data == x,y,w,xb,xe,k,s,n,t,c,fp,fpint,nrdata,ier
     87         data = dfitpack.fpcurf0(x,y,k,w=w,
---> 88                                 xb=bbox[0],xe=bbox[1],s=s)
     89         if data[-1]==1:
     90             # nest too small, setting to maximum bound

error: failed in converting 1st keyword `w' of dfitpack.fpcurf0 to C/Fortran array
4

1 に答える 1

4

コードを少し分析してみましょう。for x in range(0, 2500, 50):

  • z0 で埋められた 6 桁の文字列として定義します。これらの複数のテストの代わりに、z = "{0:06d}".format(x)またはその代わりに、いくつかの文字列フォーマットを実際に使用する必要があります。z = "%06d" % x

  • ループの最後に、要素stampがあります。(2500//50)=50

  • ファイルの存在を確認し、path開いて読み取りますが、決して閉じません。より Pythonic な方法は次のとおりです。

    try:
        with open(path,"r") as f:
            do...
    except IOError:
        do something else
    

    このwith構文では、ファイルは自動的に閉じられます。

  • pr11D配列でpr2ある可能性が高いですよね?p1次のように、 andp2リストの構築を本当に単純化できます。

    p1 = pr1.tolist()
    p2 = pr2.tolist()
    
  • リストa1のサイズは同じです。ループを 1 つにa2まとめることができます。for elem in range(len(a..)-1)機能を使用することもできnp.diffます。

  • for x in range(...)ループの終わりには、finger50 個の要素から不足しているファイルの数を引いたものになります。ファイルが見つからない場合の対処方法を説明していないため、stampfingerリストに同じ数の要素が含まれていない可能性があり、scipy.UnivariateSpline. stamp簡単な修正は、ファイルが定義されている場合にのみリストを更新することpathです (そうすれば、常に と同じ数の要素が含まれますfinger)。

  • あなたのstampnew配列には 300 の要素がありますが、あなたのstampfingerは最大で 50 しか持てません。これは 2 つ目の問題です。重み配列 ( stampnew) のサイズは入力のサイズと同じでなければなりません。

  • fingernew最終的にvsをプロットしようとしていますstamp。問題は、それが配列でfingernewなく、のインスタンスであることUnivariateSplineです。たとえば を使用して実際のポイントを計算しfingernew(stamp)、それをplot関数で使用する必要があります。

于 2012-09-02T15:12:10.753 に答える