numpy.interp()用法

numpy.interp()主要使用场景为一维线性插值,我在直接看官方文档时一下子没有明白,后来结合图像绘制才明白它的用法,下面我们使用官方代码示例和我给出的图像对其进行简单介绍。
首先官方对该函数的解释是:

一维线性插值.
返回离散数据的一维分段线性插值结果.
 
参数
x: 数组
待插入数据的横坐标.
 
xp: 一维浮点数序列
原始数据点的横坐标,如果period参数没有指定那么就必须是递增的。否则,在使用xp = xp % period正则化之后,xp在内部进行排序.
 
fp: 一维浮点数或复数序列
原始数据点的纵坐标,和xp序列等长.
 
left: 可选参数,类型为浮点数或复数(对应于fp值),当x < xp[0]时的插值返回值,默认为fp[0].
 
right: 可选参数,类型为浮点数或复数(对应于fp值),当x > xp[-1]时的插值返回值,默认为fp[-1].
period: None或者浮点数,可选参数. 横坐标的周期. 此参数使得可以正确插入angular x-coordinates. 如果该参数被设定,那么忽略left参数和right参数。
 
返回值
浮点数或复数(对应于fp值)或ndarray. 插入数据的纵坐标,和x形状相同。

下面我们一起看一下官方给的几个示例,在这之前需要注意的是,在没有设置period参数时,默认要求xp参数是递增序列,可以使用下述代码进行检查:

	np.all(np.diff(xp) > 0)

第一个示例:

import numpy as np
import matplotlib.pyplot as plt

x = 2.5
xp = [1, 2, 3]
fp = [3, 2, 0]
y = np.interp(x, xp, fp)  # 1.0
plt.plot(xp, fp, '-o')
plt.plot(x, y, 'x')
plt.show()

输出图像为:
pic_1
可以看到当x等于2.5时,在蓝色折线(原始数据构成的图线)上可以找到y=1.0为插入坐标的纵坐标。
第二个示例:

x = [0, 1, 1.5, 2.72, 3.14]
xp = [1, 2, 3]
fp = [3, 2, 0]
y = np.interp(x, xp, fp)  # array([ 3. ,  3. ,  2.5 ,  0.56,  0. ])
plt.plot(xp, fp, '-o')
plt.plot(x, y, 'x')
plt.show()

输出图像为:
pic_2
当对应的x序列为[0, 1, 1.5, 2.72, 3.14]时,得到的y序列是[ 3. , 3. , 2.5 , 0.56, 0. ],需要注意的是当x=0时,由于0 < xp[0],所以y被设定为fp[0],也就是3,当x=3.14时,由于3.14 > xp[-1],则y被设定为fp[-1],也就是0。
第三个示例:

x = 3.14
xp = [1, 2, 3]
fp = [3, 2, 0]
UNDEF = -99.0
y = np.interp(x, xp, fp, right=UNDEF)  # -99.0
plt.plot(xp, fp, '-o')
plt.plot(x, y, 'x')
plt.show()

输出图像为:
pic_3
这里将right设置为-99.0,使得x=3.14 > xp[-1]时,y取值为-99.0,同理可以对x < xp[0]的值进行设置。
第四个示例:

x = np.linspace(0, 2 * np.pi, 10)
y = np.sin(x)
xvals = np.linspace(0, 2 * np.pi, 50)
yinterp = np.interp(xvals, x, y)
plt.plot(x, y, 'o')
plt.plot(xvals, yinterp, '-x')
plt.show()

输出图像为:
pic_4
上图展示的是在正弦函数图像上进行插值,可以看到黄色叉叉连成的是一段段折线,这也就是利用线性插值对正弦函数进行逼近的效果。
以上示例对numpy.interp()的基本使用已经够了,还有一个参数period如何去使用以及官方给的示例我还没有搞清楚,以后弄懂了会补上,当然,如果各位读者朋友有知道的也欢迎在评论区加以指教。

参考文章:
numpy的一维线性插值函数

  • 99
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
`scipy.interpolate.interp2d` 是用于二维数据插值的函数,用于在二维平面上从一组给定的点中进行插值。它可以用于处理图像、地理数据等等。 函数的输入参数如下: ```python scipy.interpolate.interp2d(x, y, z, kind='linear', fill_value=None, bounds_error=False) ``` 其中: - `x`:一个一维数组,表示二维数据点在 x 轴方向上的坐标; - `y`:一个一维数组,表示二维数据点在 y 轴方向上的坐标; - `z`:一个二维数组,表示数据点的值; - `kind`:可选参数,表示插值方法,默认值为 `'linear'`。当 `kind='linear'` 时,线性插值;当 `kind='cubic'` 时,三次样条插值; - `fill_value`:可选参数,表示在插值点超出原始数据边界时的填充值,默认为 `None`; - `bounds_error`:可选参数,表示是否在插值点超出原始数据边界时引发异常,默认为 `False`,即不抛出异常。 函数返回一个可调用对象 `f`,可以通过 `f(xnew, ynew)` 对新的坐标进行插值。其中,`xnew` 和 `ynew` 分别是要进行插值的新坐标点的一维数组。 示例代码如下: ```python import numpy as np from scipy.interpolate import interp2d # 构造二维数据点 x = np.arange(0, 5, 1) y = np.arange(0, 5, 1) z = np.array([[ 0, 1, 4, 9, 16], [ 1, 2, 5, 10, 17], [ 4, 5, 8, 13, 20], [ 9, 10, 13, 18, 25], [16, 17, 20, 25, 32]]) # 构造插值函数 f = interp2d(x, y, z, kind='linear') # 对新坐标进行插值 xnew = np.linspace(0, 4, 10) ynew = np.linspace(0, 4, 10) znew = f(xnew, ynew) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值