使用python中的griddata在二维中插值3D数据

时间:2018-10-12 09:09:20

标签: python scipy

所以这是我一段时间以来一直试图以一种很好的方式解决的问题。

基本上,我有一些数据(光谱,即1000个不同波长的强度),这些数据取决于两个参数Z和A,尺寸分别为25和300。因此,我的数据是尺寸为1000x25x300的数组。我有两个数组,分别包含A和Z的不同值。

我想做的是找到我数据范围内任意值的A和Z的内插光谱(即强度为1000点)。

我觉得scipy griddata应该能够做到这一点,但是我无法弄清楚这样做的正确方法。

目前,我有:

  
      
  • Z-参数Z的25个测量值的数组
  •   
  • A-参数A的300个测量值的数组
  •   
  • Spec_data-实际光谱,由1000 x 25 x 300组成的数组
  •   
  • p_A-我要插入的A值
  •   
  • p_Z-我要插入的Z值
  •   

我想要什么:

  
      
  • out_spec-p_A和p_Z的光谱(长度为1000)。
  •   

我已经找到了解决类似问题的方法,但没有一个完全像这样。如果有人能指出正确的方向,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不是100%确定这是否是您想要的,至少此示例有效。我将Spec_data的大小更改为(20, 5, 10)而不是(1000, 25, 300),因为内插这么大的数组可能很耗时。

A = np.linspace(1, 10, 10)
Z = np.linspace(1, 5, 5)
Spec_data = np.random.randint(0, 2, size=(20,len(Z),len(A)))
p_A = 1.5
p_Z = 1.5

import numpy as np
from scipy.interpolate import interp2d

AA, ZZ = np.meshgrid(A,Z)
Spec_data_pAZ = np.ones(shape=Spec_data_pAZ.shape[0]) * np.nan
for i in range(len(Spec_data_pAZ)):
    f = interp2d(AA, ZZ, Spec_data[i])
    Spec_data_pAZ[i] = f([p_A],[p_Z])

print(Spec_data[0])
print(Spec_data_pAZ[0])

>>> [[0 1 1 1 0 0 1 1 1 1]
 [0 0 1 0 1 0 0 0 0 0]
 [1 0 1 0 0 1 0 1 1 1]
 [1 0 1 1 0 1 0 1 1 1]
 [1 0 1 0 1 1 1 1 1 1]]
>>> 0.24999999999999994