json 从给定浮点索引位置的字典中插入数据

jei2mxaa  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(107)

我有一个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是两个指数点之间的百分比。然后我必须对元组中的第二个数字再次这样做。
关于给定的指数浮动,它们可能是许多不同的数字,因为这个程序将使用不同的数字运行数百次。
我只是想知道是否有一个预先建立的方法,我可以使用请.

zfciruhq

zfciruhq1#

如果您希望在值之间进行线性插值,则很可能只需稍微调整代码,使用math.floormath.ceil函数来获取给定索引上方和下方的索引。模(%)运算符允许我们获取小数位。
这样的东西应该足够了:

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)。

你也可以把它写成一个函数,我在下面提供了几个变体,所有这些都隐含地假设你导入的是floorceil

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)

你选择哪一个最终是个人喜好的问题。我更喜欢第二种,因为它在简洁和清晰之间取得了平衡。
作为最后一点,您可能还希望对点执行线性回归,因为这可能对数据中的错误不太敏感,并且如果数据是线性的,则会产生更平滑的整体曲线。

相关问题