interpolate.splev error:'前三个参数(x,y,w)的长度必须相等'

时间:2014-08-23 20:48:43

标签: python scipy interpolation

我尝试使用scipy.interpolate以下列方式进行最小二乘拟合:

from scipy import interpolate
xnew = np.arange(min(l_bins), max(l_bins))
list1=l_bins
list1.remove(l_bins[0])
list1.remove(l_bins[-1])
tck = interpolate.splrep(l_bins,l_hits,k=3,task=-1,t=list1)
fnew = interpolate.splev(xnew, tck, der=0)
plt.plot(xnew, fnew, 'b-')

当我运行代码时,我收到此错误:

TypeError: Lengths of the first three arguments (x,y,w) must be equal

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题可能在这里:

list1=l_bins
list1.remove(l_bins[0])
list1.remove(l_bins[-1])

当您说list1=l_bins时,list1相同的对象称为l_bins。它不是副本。因此,当您使用list1remove就地删除元素时,您还要修改l_bins。这是一个例子;请注意,就地修改b也会修改a;

In [17]: a = [10, 20, 30]

In [18]: b = a

In [19]: b.remove(10)

In [20]: b
Out[20]: [20, 30]

In [21]: a
Out[21]: [20, 30]

要解决此问题,list1应该是l_bins副本。看起来l_bins是一个Python列表。在这种情况下,你可以说

list1 = l_bins[:]

但是,您似乎要从l_bins中删除list1的第一个和最后一个元素。在这种情况下,您可以替换此

list1 = l_bins[:]
list1.remove(l_bins[0])
list1.remove(l_bins[-1])

list1 = l_bins[1:-1]