gpt4 book ai didi

python - 数据存储以简化 Python 中的数据插值

转载 作者:太空狗 更新时间:2023-10-29 22:20:36 26 4
gpt4 key购买 nike

我有 20 多个类似于表 1 的表。其中所有字母代表实际值。

Table 1:
$ / cars |<1 | 2 | 3 | 4+
<10,000 | a | b | c | d
20,000 | e | f | g | h
30,000 | i | j | k | l
40,000+ | m | n | o | p

例如,用户输入可以是 (2.4, 24594),它是介于 f、g、j 和 k 之间的值。我计算此双线性插值的 Python 函数定义和伪代码如下。

def bilinear_interpolation( x_in, y_in, x_high, x_low, y_low, y_high ):
# interpolate with respect to x
# interpolate with respect to y
# return result

我应该如何存储表 1 中的数据(一个文件、一个字典、元组的元组或列表的字典),以便我可以最有效和正确地执行双线性插值?

最佳答案

如果你想要我能想到的计算效率最高的解决方案并且不局限于标准库,那么我会推荐 scipy/numpy。首先,将 a..p 数组存储为 2D numpy 数组,然后将 $4k-10k 和 1-4 数组存储为 1D numpy 数组。如果两个一维数组都是单调递增的,则使用 scipy 的 interpolate.interp1d,如果不是,则使用 interpolate.bsplrep(双变量样条表示),并且您的示例数组与您的示例一样小。或者干脆自己写,不用理会 scipy。以下是一些示例:

# this follows your pseudocode most closely, but it is *not*
# the most efficient since it creates the interpolation
# functions on each call to bilinterp
from scipy import interpolate
import numpy
data = numpy.arange(0., 16.).reshape((4,4)) #2D array
prices = numpy.arange(10000., 50000., 10000.)
cars = numpy.arange(1., 5.)
def bilinterp(price,car):
return interpolate.interp1d(cars, interpolate.interp1d(prices, a)(price))(car)
print bilinterp(22000,2)

我上次检查(2007 年左右的 scipy 版本)它只适用于单调递增的 x 和 y 数组)

对于像这个 4x4 数组这样的小数组,我想你想使用这个: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.bisplrep.html#scipy.interpolate.bisplrep这将处理更有趣的形状表面,并且该功能只需要创建一次。对于更大的阵列,我想你想要这个(不确定这是否具有与 interp1d 相同的限制): http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html#scipy.interpolate.interp2d但与上面示例中的三个数组相比,它们都需要不同且更冗长的数据结构。

关于python - 数据存储以简化 Python 中的数据插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/902910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com