在 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 的分隔。此外,值的范围也是可变的,例如:
- 一个字典的x范围是-50.0到50.0,y范围是-60.0到60.0,分辨率为0.5
- 第二个字典的 x 范围为 -100.0 到 100.0,y 范围为 -100.0 到 100.0,分辨率为 5.0
我需要创建一个采用二维值(例如 3.49、20.31)和 returns 网格中的插值的函数。
怎么做?
我想先将此表单转换为 Numpy 数组会有所帮助,但我不知道该怎么做。
编辑:
- 输入的二维值将始终在网格中,不能超出其范围。
- 我对插值法没有偏好,线性插值法就好
使用示例字典,我构建了所需的 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
我有 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 的分隔。此外,值的范围也是可变的,例如:
- 一个字典的x范围是-50.0到50.0,y范围是-60.0到60.0,分辨率为0.5
- 第二个字典的 x 范围为 -100.0 到 100.0,y 范围为 -100.0 到 100.0,分辨率为 5.0
我需要创建一个采用二维值(例如 3.49、20.31)和 returns 网格中的插值的函数。
怎么做?
我想先将此表单转换为 Numpy 数组会有所帮助,但我不知道该怎么做。
编辑:
- 输入的二维值将始终在网格中,不能超出其范围。
- 我对插值法没有偏好,线性插值法就好
使用示例字典,我构建了所需的 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