提问人:PW1990 提问时间:10/15/2023 最后编辑:PW1990 更新时间:10/15/2023 访问量:29
从字典中插入给定浮点索引位置的数据
Interpolate data from dictionary given a float index position
问:
我有一个json文件,其中包含给定温度的扭矩数字数据元组。假设我从 46 度部分提取数据:
j = {"46": [[88.0, 95.3], [86.1, 93.4], [84.2, 91.3], [82.8, 89.7], [80.8, 87.8]]}
如果随后给我一个浮点数作为参考索引位置,例如:
index = 1.85
是否可以仅使用浮点索引位置从数据中插值? 显然,如果我尝试将直线浮点数作为索引位置,它会给我:
TypeError: list indices must be integers or slices, not float
目前,我正在找到浮点数上方和下方最接近的整数,然后手动插值,但这很乏味。我需要对元组中给出的两个数字进行插值。.例如,在索引处,我正在做:1.85
lower_first_num = j["46"][1][0]
upper_first_num = j["46"][2][0]
difference = lower_first_num - upper_first_num
result = lower_first_num - (difference * .85)
其中 .85 是两个指数点之间的百分比。然后,我必须对元组中的第二个数字再次执行此操作。
关于给定的指数浮点数,它们可能是许多不同的数字,因为该程序将以不同的数字运行数百次。
我只是想知道是否有我可以使用的预构建方法......
答:
0赞
Mous
10/15/2023
#1
如果您希望在值之间进行线性插值,您很可能只需稍微调整代码,使用 math.floor 和 math.ceil
函数来获取给定索引上方和下方的索引。modulo () 运算符允许我们抓取小数位。
%
像这样的东西就足够了:
from math import floor, ceil
data = j["46"] # [[88.0, 95.3], [86.1, 93.4], [84.2, 91.3], [82.8, 89.7], [80.8, 87.8]]
index = 1.85
before, after = data[floor(index)][0], data[ceil(index)][0] # 86.1, 84.2
step = index % 1 # .85
difference = after - before # -1.9
lerped_value = before + step * difference # 84.485
print(lerped_value) # 84.485
下面是一张图像(使用 Desmos 创建),绿色虚线表示每个点之间的线性插值,红色虚线表示 index=1.85,红点表示插值点 (1.85, 84.485)。
您也可以将其编写为一个函数,我在下面包含了一些变体,所有这些变体都隐含地假设您正在导入 和 .floor
ceil
def interpolate(data : list[list[float]], index : float) -> float:
before, after = data[floor(index)][0], data[ceil(index)][0]
step = index % 1
difference = after - before
lerped_value = before + step * difference
return lerped_value
def interpolate(data : list[list[float]], index : float) -> float:
before, after = data[floor(index)][0], data[ceil(index)][0]
return before + (index % 1) * (after - before)
def interpolate(data : list[list[float]], index : float) -> float:
return (before := data[floor(index)][0]) + (index % 1) * (data[ceil(index)][0] - before)
你选择哪一个最终取决于个人喜好。我更喜欢第二种,因为在简洁和清晰之间取得平衡。
最后,您可能还希望对点执行线性回归,因为这可能对数据中的错误不太敏感,并且如果数据是线性的,则生成更平滑的整体曲线。
评论