如何使用Python在表格中进行2D插值?

2024-10-03 09:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数字表,有两个初始行和列(粗体),它们是CI和CII的值作为输入。我的输入可以是这两个值之间的一个值,在此基础上,我应该通过交叉表中的值进行插值

比如说,我应该从表中找到相应的值,CI=0.33,在粗体第一行的0.3到0.35之间,CII=1.1

关于2D插值的其他问题在这方面并没有真正帮助我因为我正在另一个软件中使用python插件,无法导入scipty.interp2D。 如果能在不需要特定图书馆的情况下提出一些解决方案,我将不胜感激

values

我不确定要使用的插值类型。也许是线性的。为了提供更好的透视图,我从表中绘制了3个任意行,仅取该行并根据样本编号进行绘制,似乎它们在样本上有不同的行为。第一个增加,最后一个减少,但从来不是一条线:

enter image description here


Tags: 插件ci软件图书馆绘制情况数字解决方案
1条回答
网友
1楼 · 发布于 2024-10-03 09:14:06

你想要什么样的插值?多项式的?指数分段平滑?阶跃线性可以吗

假设逐步线性,您可以手动编写一个函数:

# Sample data. 
X    = [0,5,10] # Left to right, like in your table. 
Y    = [0,2]    # Top to bottom, like in your table. 
grid = [[1,2,4],[4,5,10]]

def f(x,y):
    # Find the vales that x and y are between. 
    xi,yi = None,None
    for i,(x1,x2) in enumerate(zip(X[:-1],X[1:])):
        if x1 <= x <= x2:
            xi,w_x2,w_x1 = i,(x-x1)/(x2-x1),(x2-x)/(x2-x1)
            break
    for i,(y1,y2) in enumerate(zip(Y[:-1],Y[1:])):
        if y1 <= y <= y2:
            yi,w_y2,w_y1 = i,(y-y1)/(y2-y1),(y2-y)/(y2-y1)
            break
    if xi is None or yi is None:
        return False 
        # You could add special cases to interpolate past the range if you would like. 
    # Find the weighted average between the four corners. 
    ave  = grid[yi][xi]    *w_y1*w_x1
    ave += grid[yi][xi+1]  *w_y1*w_x2
    ave += grid[yi+1][xi]  *w_y2*w_x1
    ave += grid[yi+1][xi+1]*w_y2*w_x2
    return ave

print(f(0,0),f(2.5,0),f(4,0),f(5,0),f(7.5,0),f(10,0))
print(f(0,1),f(2.5,1),f(4,1),f(5,1),f(7.5,1),f(10,1))
print(f(0,2),f(2.5,2),f(4,2),f(5,2),f(7.5,2),f(10,2))

如果有更多的信息,这可以更有效地完成。例如,如果x值之间的x_delta一致,则可以跳过For循环。如果使用sortedcontainers包中的SortedList,也可以跳过for循环。如果您想使用数组而不是列表等,这可能也适用于numpy

您没有向我提供任何关于您可以使用的模块或您想要的算法的工作代码或知识,所以我没有尽我所能写下这篇文章。:-)


编辑:

你不应该让人们从PNG图像中键入你的数据。这是一小部分,我不能再打了

X    = [0,0.05,0.1,0.15,0.2] 
Y    = [0.2,0.4] 
grid = [[1,1.116,1.211,1.297,1.376],[1,1.094,1.174,1.248,1.319]]

...

print(f(0,0.2),f(0.025,0.2),f(0.05,0.2))

相关问题 更多 >