由于我正在使用的采样率以及它正在计算的数量,我一直试图平滑一个噪声很大的情节。我一直在使用这里的帮助 - 主要是Plot smooth line with PyPlot(虽然我找不到“样条”功能,所以使用UnivarinteSpline
代替)
但是,无论我做什么,我都会遇到"x and y are not of the same length"
或scipi.UnivariateSpline
的{{1}}值不正确的pyplot错误。我不太确定如何解决这个问题(不是真正的Python人!)我已经附加了代码,尽管它只是最后的绘图位导致了问题。感谢
w
有关信息,数据输入文件只是一个整数列表(两个列表由选项卡分隔,如代码所示)。
以下是我收到的错误代码之一:
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 :(得分: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
可能是一维数组,对吧?您可以真正简化p1
和p2
列表的构建:
p1 = pr1.tolist()
p2 = pr2.tolist()
您的列表a1
,a2
具有相同的大小:您可以将for elem in range(len(a..)-1)
个圈组合在一个中。您也可以使用np.diff
功能。
在for x in range(...)
循环结束时,finger
将有50个元素减去丢失文件的数量。由于您不知道在文件丢失的情况下该怎么做,因此stamp
和finger
列表可能没有相同数量的元素,这会导致scipy.UnivariateSpline
崩溃。一个简单的解决方法是仅在stamp
文件被定义时更新path
列表(这样,它始终与finger
具有相同数量的元素。)
当stampnew
和stamp
最多只有50个时,您的finger
数组有300个元素。这是第二个问题,即权重数组的大小({ {1}})必须与输入的大小相同。
您最终会尝试绘制stampnew
vs fingernew
。问题是stamp
不一个数组,它是fingernew
的实例。您仍然需要计算一些实际点数,例如使用UnivariateSpline
,然后在fingernew(stamp)
函数中使用它。