在scipy中使用PiecewisePolynomial插入数组列

时间:2014-08-04 13:12:58

标签: python arrays numpy scipy interpolation

我尝试使用scipy的PiecewisePolynomial插入numpy数组的每一列。我知道这对于scipy的interp1d是可能的,但是对于分段多项式插值,它似乎不会以相同的方式工作。我有以下代码:

import numpy as np
import scipy.interpolate as interpolate

x1=np.array([1,2,3,4])
y1=np.array([[2,3,1],[4,1,6],[1,2,7],[3,1,3]])
interp=interpolate.PiecewisePolynomial(x1,y1,axis=0)

x = np.array([1.2, 2.1, 3.3])

y = interp(x)

结果为y = np.array([2.6112, 4.087135, 1.78648])。似乎只有y1中的第一列被考虑用于插值。如何让方法在y1指定的点处返回x中每列的插值?

1 个答案:

答案 0 :(得分:0)

scipy.interpolate.PiecewisePolynomialy1的不同列解释为要插值的函数的导数,而interp1d将列解释为不同的函数。

如果您没有可用的衍生产品,可能根本就不想使用PiecewisePolynomial。如果您只想进行更平滑的插值,请尝试interp1d,例如kind='quadratic'关键字参数。 (参见interp1d

的文档

现在你的功能看起来很有趣

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

x = linspace(0,5,200)
ax.plot(x, interp(x))
ax.plot(x1, y1[:,0], 'o')

enter image description here

如果您尝试二次样条插值:

interp = scipy.interpolate.interp1d(x1, y1.T, kind='quadratic')

fig = plt.figure()
ax = fig.add_subplot(111)

x = linspace(1,4,200)
ip = interp(x)
ax.plot(x, ip[0], 'b')
ax.plot(x, ip[1], 'g')
ax.plot(x, ip[2], 'r')

ax.plot(x1, y1[:,0], 'bo')
ax.plot(x1, y1[:,1], 'go')
ax.plot(x1, y1[:,2], 'ro')

这可能更接近你想要的东西:

enter image description here