用多列插入数据
Interpolate data with multiple columns
我是 Python 的新手。我正在尝试从如下所示的数据集中插入数据值:
a = [45.0,0.0017317314,-0.00274,...]
[45.07,0.00173326,-0.002278,...]
.
.
.
我想在第一列数据的某些值处找到从第二列到最后一列的数据值。
我试过以下代码:
interp_data = np.interp(45.01,a[:,0],a[:,1])
作为初始尝试,为一列查找一个数据点的值。但是,它 returns 错误 'object too deep for desired array'
但是,下面的作品在 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])
其中值是我要插入的数据点数组。
问题是您试图以不正确的方式访问列表。使用 [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 数据放在一个列表中,您只需要访问列表的第一个元素,然后访问第一个列表元素中包含的数据,就像访问第一个数组的行你得到所有列上包含的所有数据,不同之处在于你不需要为处理程序的 "second row" 指定 (1,:) only [1].
此错误可能是由于 a 的形状与您预期的不同所致。我得到:
>>> 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 的忠实粉丝。
我是 Python 的新手。我正在尝试从如下所示的数据集中插入数据值: a = [45.0,0.0017317314,-0.00274,...] [45.07,0.00173326,-0.002278,...] . . .
我想在第一列数据的某些值处找到从第二列到最后一列的数据值。
我试过以下代码:
interp_data = np.interp(45.01,a[:,0],a[:,1])
作为初始尝试,为一列查找一个数据点的值。但是,它 returns 错误 'object too deep for desired array'
但是,下面的作品在 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])
其中值是我要插入的数据点数组。
问题是您试图以不正确的方式访问列表。使用 [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 数据放在一个列表中,您只需要访问列表的第一个元素,然后访问第一个列表元素中包含的数据,就像访问第一个数组的行你得到所有列上包含的所有数据,不同之处在于你不需要为处理程序的 "second row" 指定 (1,:) only [1].
此错误可能是由于 a 的形状与您预期的不同所致。我得到:
>>> 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 的忠实粉丝。