在2D Python数字字典中插值

时间:2015-01-11 19:59:46

标签: python arrays numpy dictionary interpolation

我的Python词典看起来像这样:

a = {0.0 : {0.0: 343, 0.5: 23, 1.0: 34, 1.5: 9454, ...}, 0.5 : {0.0: 359, 0.5: -304, ...}, ...}

因此它们是2D字典,类似于m * n元素的2D网格。

值均匀分布,但字典可能有不同的“分辨率”。例如,在上面的例子中,值之间用0.5表示。另一本字典的分离为1.0。此外,值的范围也是可变的,例如:

  • 一个字典的x范围为-50.0到50.0,y为-60.0到60.0,分辨率为0.5
  • 第二个字典的x范围为-100.0到100.0,y为-100.0到100.0,分辨率为5.0

我需要创建一个采用2D值(例如3.49,20.31)的函数,并返回网格中的插值。

怎么做?

我想首先将此表单转换为Numpy数组会有所帮助,但我不知道该怎么做。

编辑:

  • 输入的2D值将始终位于网格中,不能超出其范围。
  • 我不喜欢插值方法,线性插值方法很好。

1 个答案:

答案 0 :(得分:1)

使用示例字典,我构建了所需的numpy数组,xy和2d z。然后使用scipy插补器来完成剩下的工作。

import numpy as np

a = {0.0 : {0.0: 0, 0.5: 3, 1.0: 6, 1.5: 9},
 0.5 : {0.0: 1, 0.5: 5, 1.0: 9, 1.5: 13},
 1.0 : {0.0: 2, 0.5: 7, 1.0: 12, 1.5: 17},
 1.5 : {0.0: 3, 0.5: 9, 1.0: 15, 1.5: 21},
 2.0 : {0.0: 4, 0.5: 11, 1.0: 18, 1.5: 25},
    }
print a
x = np.array(sorted(a.keys()))   # dictionary keys might not be sorted
print x
y = np.array(sorted(a[x[0]].keys()))
print y
z = np.zeros((len(x),len(y)))
for i,m in enumerate(x):
    for j,n in enumerate(y):   # assumes nested keys are all the same
        z[i,j] = a[m][n]
print z

请注意,这些数组看起来很像列表或列表。

from scipy import interpolate
f = interpolate.interp2d(y,x,z,kind='linear') #  columns, rows, data
print f([0,.25,.5,.75],[0,.25,.5,.75])
制造

{0.0: {0.0: 0, 0.5: 3, 1.5: 9, 1.0: 6}...}}  # dict

[ 0.   0.5  1.   1.5  2. ]   # x
[ 0.   0.5  1.   1.5]    # y
[[  0.   3.   6.   9.]   # z
 [  1.   5.   9.  13.]
 [  2.   7.  12.  17.]
 [  3.   9.  15.  21.]
 [  4.  11.  18.  25.]]

[[  0.     1.5    3.     4.5    6.  ]
 [  0.5    2.25   4.     5.75   7.5 ]
 [  1.     3.     5.     7.     9.  ]
 [  1.5    3.75   6.     8.25  10.5 ]
 [  2.     4.5    7.     9.5   12.  ]]

http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.interp2d.html