在 2D Python 数值字典中插入值

Interpolate values in a 2D Python numerical dictionary

我有 Python 部字典,如下所示:

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

所以它们是类似于 m * n 元素的二维网格的二维字典。

值分布均匀,但字典可能不同"resolutions"。例如,在上面的示例中,值以 0.5 分隔。另一本字典有 1.0 的分隔。此外,值的范围也是可变的,例如:

我需要创建一个采用二维值(例如 3.49、20.31)和 returns 网格中的插值的函数。

怎么做?

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

编辑:

使用示例字典,我构建了所需的 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