【问题标题】:Unexpected numpy interpolation behavior for x array spanning negative to positive (ordered as increasing)x 数组从负到正的意外 numpy 插值行为(按递增排序)
【发布时间】:2024-05-24 00:00:02
【问题描述】:

使用np.interp(query, x, y) 有时会产生与我在 Excel 中计算的结果相同的结果。这是np.interp()和Excel一致的情况:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'x': [-9.210,-6.908,-4.605,-2.303,0.000,2.303],
     'y': [-1.867,-1.867,-2.027,-3.667,-7.850,-21.112]}
)

val = -7.313

test1 = np.interp(val, df['x'], df['y'])

print(test1) 产生-1.867。这与我在 Excel 中计算的结果完全相同(我们的查询值在黄色值之间):


但是,test2 = np.interp(val, df['y'], df['x']) 产生 2.303。在 Excel 中,我计算了-0.2956,这看起来是正确的,因为我们的查询值介于黄色值之间。


在 numpy 中是否存在某种奇怪的行为,当尝试插值时,它会从负数到零到正数感到困惑?我已经用一个更加描述化的数据框(50 行而不是这 6 行)尝试了这个,并且值总是按递增顺序排列,我遇到了同样的问题。

【问题讨论】:

  • scipy interpolate 按预期执行:f = interpolate.interp1d(df['y'], df['x']) ... test2 = f(val) 返回 -0.2956

标签: python numpy interpolation


【解决方案1】:

预测变量列中的值必须按升序排列。 (注意:-21 小于 -1.8 在数轴上,-1 小于 1。)使用 sort_values 按 y 列升序对数据框进行排序,然后输出与您的 Excel 输出匹配。

df1=df.sort_values(by="y")

test3= np.interp(val, df1["y"], df1["x"])

print(test3)

-0.29565168539325837

【讨论】: