我有两个值,并且知道它们在一个充满NaN的数组中的索引.我想插值/外推所有nan的

import numpy as np
y = np.array([np.nan, np.nan, 0.75, np.nan, np.nan, np.nan, np.nan, np.nan, 2.25])

借助这answer条,我写下以下内容:

nans, x = np.isnan(y), lambda z: z.nonzero()[0]
y[nans] = np.interp(x(nans), x(~nans), y[~nans])

我的输出如下:

[0.75 0.75 0.75 1. 1.25 1.5 1.75 2. 2.25]

然而,我希望它是:

[0.25 0.5 0.75 1. 1.25 1.5 1.75 2. 2.25]

增量始终是一个常数.

如何指定leftright以获得所需的输出?

推荐答案

你不能指定leftright来实现interp的外推,它们只是常数.

如果您喜欢纯numpy解决方案,则可以基于插值数组的前/后两个值进行线性外推:

def extrap(x, xp, fp):
    m = (fp[1] - fp[0]) / (xp[1] - xp[0])
    n = fp[0] - m * xp[0]
    result = m * x[x < xp[0]] + n
    m = (fp[-1] - fp[-2]) / (xp[-1] - xp[-2])
    n = fp[-1] - m * xp[-1]
    return np.concatenate([result, m * x[x > xp[-1]] + n])

(您可能需要添加len(xp) > 1len(xp) == len(yp)的验证)

例子:

y = np.array([np.nan, np.nan, 0.75, np.nan, np.nan, np.nan, np.nan, np.nan, 2.25, np.nan])

nans, x = np.isnan(y), lambda z: z.nonzero()[0]
y[nans] = np.interp(x(nans), x(~nans), y[~nans], np.nan, np.nan)

nans, x = np.isnan(y), lambda z: z.nonzero()[0]
y[nans] = extrap(x(nans), x(~nans), y[~nans])

后果

array([0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  , 2.25])

Python相关问答推荐

使用新的类型语法正确注释ParamSecdecorator (3.12)

Python上的Instagram API:缺少client_id参数"

如何找到满足各组口罩条件的第一行?

如何制作10,000年及以后的日期时间对象?

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

如何获取numpy数组的特定索引值?

numpy卷积与有效

如何使用Python以编程方式判断和检索Angular网站的动态内容?

pandas:排序多级列

迭代嵌套字典的值

改进大型数据集的框架性能

用渐近模计算含符号的矩阵乘法

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

如何防止Pandas将索引标为周期?

Flask Jinja2如果语句总是计算为false&

PYTHON、VLC、RTSP.屏幕截图不起作用

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

如何在一组行中找到循环?

如何写一个polars birame到DuckDB

为什么内置的sorted()对于一个包含降序数字的列表来说,如果每个数字连续出现两次,会变慢?