使用多列插值数据

4
我是一个新手Python,我试图从看起来像这样的数据集中插值数据值: a = [45.0,0.0017317314,-0.00274,...] [45.07,0.00173326,-0.002278,...] . . .
我想找到第一列数据的某些值上的数据的第二列到最后一列的值。
我尝试了以下代码:
interp_data = np.interp(45.01,a[:,0],a[:,1])

作为一种尝试,为了找到一个列的数据点的值。然而,它返回错误:“对象太深,无法得到所需的数组”。
然而,在shell中可以使用以下方法。
>>> xp = [45.0, 45.074969417037, 45.224757625296, 45.523726383073]

>>> fp = [1.73145123922036E-002, 1.73326024230735E-002, 1.73689532454203E-002, 1.74423417607930E-002]

>>> import numpy

>>> numpy.interp(45.1, xp, fp)

0.017338676881704793

另外,我希望能够对多个值执行此操作:

for i in range(len(a)):

 for j in range(a.shape[1]):
   interp_data = np.interp(values,a[:,j],a[:,j])

其中values是一个数组,包含我想要进行插值的数据点。

2个回答

0
问题在于您尝试以错误的方式访问列表。列表是通过a[1][:](例如)进行访问的。使用此方法,您将获得列表第二个元素的所有值。 例如,您可以这样做:
xp = [0,1,2,3,4]
fp = [[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]
np.interp(1.5,xp,fp[0])
3.5
np.interp(1.5,xp,fp[1])
4.5
np.interp(1.5,xp,fp[2])
5.5

如果您想将所有的Y数据放入一个列表中,您只需要访问列表的第一个元素,就可以访问到第一个列表元素中包含的数据,就像访问数组的第一行可以获取所有列中包含的数据一样,不同之处在于您不需要指定(1,:),只需要使用处理程序的"[1]"来表示"第二行"。


0

这个错误可能是由于形状与您期望的不同而引起的。我得到:

>>> a = np.zeros((10,2))
>>> print np.interp(0,a[:,0],a[:,1])
0.0

>>> a = np.zeros((10,2,3))   #note incorrect shape
>>> print np.interp(0,a[:,0],a[:,1])
ValueError: object too deep for desired array

一旦你理清了排序的形状,你就可以轻松地进行操作。

points = #the 1D array of data points you want to interpolate to
interp_data = np.interp(points,a[:,0],a[:,1])

请注意,np.interp 仅提供线性插值。对于更复杂的插值器,您需要使用scipy.interpolate(这是非常好的!)。我很喜欢UnivariateSpline。

是的,我认为问题出在我的数组a的形状上,看起来像这样: [[ 0.01731451] [ 0.0173326 ] [ 0.01736895]] 而不是 [0.01731454, 0.0173326, ...]。我想我需要从数组中解包元素。有什么想法吗? - Afzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接