3

由于我使用的采样率以及它的计数,我一直在尝试平滑一个嘈杂的情节。我一直在这里使用帮助 - 主要是用 PyPlot 绘制平滑线(虽然我找不到“样条线”函数,所以我UnivarinteSpline改用)

但是,无论我做什么,我都会遇到 pyplot 错误,"x and y are not of the same length"或者pyplotscipi.UnivariateSpline的值w不正确。我不太确定如何解决这个问题(不是真正的 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()

作为信息,数据输入文件只是一个整数列表(如代码所示,两个列表由制表符分隔)。

这是我得到的错误代码之一:

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):

  • 您定义z为用 0 填充的 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语法,您的文件会自动关闭。

  • pr1并且pr2很可能是一维数组,对吗?您可以真正将您的p1p2列表的构造简化为:

    p1 = pr1.tolist()
    p2 = pr2.tolist()
    
  • a1您的列表a2具有相同的大小:您可以将for elem in range(len(a..)-1)循环组合成一个循环。您也可以使用该np.diff功能。

  • for x in range(...)循环结束时,finger将有 50 个元素减去丢失文件的数量。由于您没有告诉在丢失文件的情况下该怎么做,因此您的stampfinger列表可能没有相同数量的元素,这会使您的scipy.UnivariateSpline. 一个简单的解决方法是stamp仅在path定义文件时更新您的列表(这样,它始终具有与 相同数量的元素finger)。

  • 您的stampnew数组有 300 个元素,而您的stampfinger最多只能有 50 个。这是第二个问题,权重数组 ( stampnew) 的大小必须与输入的大小相同。

  • 您最终会尝试绘制fingernewvs stamp。问题是它fingernew不是一个数组,它一个UnivariateSpline. 您仍然需要计算一些实际点,例如使用fingernew(stamp),然后在您的plot函数中使用它。

于 2012-09-02T15:12:10.753 回答