我的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。此外,值的范围也是可变的,例如:
我需要创建一个采用2D值(例如3.49,20.31)的函数,并返回网格中的插值。
怎么做?
我想首先将此表单转换为Numpy数组会有所帮助,但我不知道该怎么做。
编辑:
答案 0 :(得分:1)
使用示例字典,我构建了所需的numpy
数组,x
,y
和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