Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多元插值?_Python_Numpy_Scipy_Interpolation - Fatal编程技术网

Python 多元插值?

Python 多元插值?,python,numpy,scipy,interpolation,Python,Numpy,Scipy,Interpolation,我有这样的数据。x轴速度和y轴功率。这是一个情节。但是,在速度与功率的关系图上,也有一些C值给出了其他曲线图 数据如下: C = 12 speed:[127.1, 132.3, 154.3, 171.1, 190.7, 195.3] power:[2800, 3400.23, 5000.1, 6880.7, 9711.1, 10011.2 ] C = 14 speed:[113.1, 125.3, 133.3, 155.1, 187.7, 197.3] power:[2420, 3320, 4

我有这样的数据。x轴速度和y轴功率。这是一个情节。但是,在速度与功率的关系图上,也有一些C值给出了其他曲线图

数据如下:

C = 12
speed:[127.1, 132.3, 154.3, 171.1, 190.7, 195.3]
power:[2800, 3400.23, 5000.1, 6880.7, 9711.1, 10011.2 ]

C = 14
speed:[113.1, 125.3, 133.3, 155.1, 187.7, 197.3]
power:[2420, 3320, 4129.91, 6287.17, 10800.34, 13076.5 ]
现在,我希望能够在
[[12.2122.1],[12.4137.3],[12.5154.9],[12.6171.4],[12.7192.6],[12.8198.5]
中进行插值

我已经看过答案了。我不确定这是否是一种方法

我试过:

data = np.array([[12, 127.1, 2800], [12, 132.3, 3400.23], [12, 154.3, 5000.1], [12, 171.1, 6880.7],
                [12, 190.7, 9711.1], [12, 195.3, 10011.2],
                [14, 113.1, 2420], [14, 125.3, 3320], [14, 133.3, 4129.91], [14, 155.1, 6287.17],
                [14, 187.7, 10800.34], [14, 197.3, 13076.5]])

coords = np.array([[12.2, 122.1], [12.4, 137.3], [12.5, 154.9], [12.6, 171.4], [12.7, 192.6], [12.8, 198.5]])

z = ndimage.map_coordinates(data, coords.T, order=2, mode='nearest')
但是,我收到:

array([13076.5, 13076.5, 13076.5, 13076.5, 13076.5, 13076.5])

我不知道如何处理这种插值。

在我看来,这里的所有内容都是:

速度=F(C),功率=G(C)


因此,您不需要任何多变量插值,只需创建一个速度函数和另一个功率函数…

假设函数的形式为幂=F(C,速度),您可以使用:

这将产生:

[1632.4 2659.5 3293.4 4060.2 5074.8 4506.6]
[ 2753.2  3780.8  5464.5  7505.2 10705.9 11819.6]
看起来有点低。原因是默认情况下,
interp2d
使用线性样条曲线拟合,并且您的数据肯定是非线性的。通过以下方式直接访问样条曲线拟合例程,可以获得更好的结果:

这将产生:

[1632.4 2659.5 3293.4 4060.2 5074.8 4506.6]
[ 2753.2  3780.8  5464.5  7505.2 10705.9 11819.6]

这似乎更合理

map\u坐标
假设在每个整数索引处都有项目,就像在图像中一样。也就是说,(0,0)、(0,1)…,(0,100),(1,0),(1,1),…,(100,0),(100,1),…,(100,100)都是定义良好的坐标,如果您有一个100x100图像。这不是你的情况。在坐标(12127.1)、(12132.3)等处有数据

您可以改用
griddata
。根据插值方式的不同,将得到不同的结果:

In [24]: data = np.array([[12, 127.1, 2800], [12, 132.3, 3400.23], [12, 154.3, 5000.1], [12, 171.1, 6880.7],
    ...:                 [12, 190.7, 9711.1], [12, 195.3, 10011.2],
    ...:                 [14, 113.1, 2420], [14, 125.3, 3320], [14, 133.3, 4129.91], [14, 155.1, 6287.17],
    ...:                 [14, 187.7, 10800.34], [14, 197.3, 13076.5]])

In [25]: from scipy.interpolate import griddata

In [28]: coords = np.array([[12.2, 122.1], [12.4, 137.3], [12.5, 154.9], [12.6, 171.4], [12.7, 192.6], [12.8, 198.5]])

In [29]: griddata(data[:, 0:2], data[:, -1], coords)
Out[29]:
array([           nan,  3895.22854545,  5366.64369048,  7408.68906748,
       10791.779     ,            nan])

In [31]: griddata(data[:, 0:2], data[:, -1], coords, method='nearest')
Out[31]: array([ 3320.  ,  4129.91,  5000.1 ,  6880.7 ,  9711.1 , 13076.5 ])

In [32]: griddata(data[:, 0:2], data[:, -1], coords, method='cubic')
Out[32]:
array([           nan,  3998.75479082,  5357.54672326,  7297.94115979,
       10647.04183455,            nan])
method='cubic'
可能对“随机”数据具有最高的保真度,但只有您可以决定哪种方法适合您的数据以及您尝试执行的操作(默认值为
method='linear'
,在上面的
[29]
中使用)

请注意,有些答案是
nan
。这是因为您提供的输入不在点在二维空间中形成的“边界多边形”内

下面是一个可视化的例子,向您展示我的意思:

In [49]: x = plt.scatter(x=np.append(data[:, 0], [12.2, 12.8]), y=np.append(data[:, 1], [122.1, 198.5]), c=['green']*len(data[:, 0]) + ['red']*2)

In [50]: plt.show()

我没有用绿色连接点,但是你可以看到红色的两个点在多边形的外面,如果我连接了这些点,就会形成多边形。不能在该范围外插值,因此会得到
nan
。要知道为什么,考虑1D情况。如果我问你
[0,1,2,3]
的索引2.5的值是多少,合理的回答应该是
2.5
。然而,如果我问索引100的值是多少…我们事先不知道100的值是多少,这远远超出了你所能看到的范围。所以我们不能真正给出答案。对于这个功能来说,说它是
100
是错误的,因为这将是外推,而不是插值


HTH.

Hi.为了计算功率,我需要功率、速度和C点。所以,我得到的是:
f(C,速度)
然后@tel的回答谢谢!很好的解决方案!谢谢你的信息(upv)谢谢你的解决方案!另一个答案对我来说似乎更直截了当,并根据我的预期给出了更好的结果。(upv)@George我在回答中添加了一点关于使用
scipy.interpolate
中的基本样条曲线拟合功能以更好地拟合数据的内容。考虑到数据的稀疏性,从
griddata
获得的结果可能更准确。另一方面,对于@MattMessersmith提到的“边界多边形”之外的插值数据,样条拟合仍然会给出合理的结果(而不仅仅是
NaN
):感谢您提供的信息!我想问。
kx=2
对于
C
来说意味着2级?和
ky=3
3度
speed
?我希望是抛物线图,所以使用
ky=2
?我说得对吗?@George如果你对你的系统有这样的先验知识,无论如何你应该把它包括在你的模型中。如果您知道
功率
C
速度方面都是二次的(即抛物线形状),那么使用
kx,ky=2,2
。如果
功率
速度
中是二次的,而在
C
中是线性的,则使用
kx,ky=1,2