代码之家  ›  专栏  ›  技术社区  ›  dassouki

numpy阵列上的线性插值

  •  2
  • dassouki  · 技术社区  · 16 年前

    我有以下numpy数组:

    #                      A    B    C         Y
    my_arr = np.array([ [.20, .54, .26],     # <0
                        [.22, .54, .24],     # 1
                        [.19, .56, .25],     # 2
                        [.19, .58, .23],     # 3
                        [.17, .62, .21] ])   # 4+
    

    如果用户输入y(例如,2.5),我应该输出三个值,一个用于a、B和C:

    在我的例子中,A:.19,B:.57,C:.24

    更多示例:

    Y     A      B      C
    0.2   .20    .54    .26 
    1.5   .215   .55    .245
    4.0   .17    .62    .21
    8.7   .17    .62    .21
    

    用户将输入y值的倍数作为numpy数组。结果也应该是一个数组

    例如,我已经编写了一些代码

    #boundaries:
    y[y < 0] = 0
    y[y > 4] = 4
    

    我还假设scipy.ndimage/map\u坐标最适合我的要求,而不是scipy.interpolate,但我可能错了

    2 回复  |  直到 16 年前
        1
  •  6
  •   Judge Maygarden    16 年前
    from scipy import array, ndimage
    
    #              A    B    C         Y
    m = array([ [.20, .54, .26],     # 0
                [.22, .54, .24],     # 1
                [.19, .56, .25],     # 2
                [.19, .58, .23],     # 3
                [.17, .62, .21] ])   # 4
    
    inputs = array([-1, 0, 0.2, 1, 1.5, 2, 2.5, 3, 4, 8.7])
    inputs[inputs < 0] = 0
    inputs[inputs > 4] = 4
    
    for y in inputs:
        x = ndimage.map_coordinates(m, [y * numpy.ones(3), numpy.arange(3)], order=1)
        print y, x
    

    >>> 
    0.0 [ 0.2   0.54  0.26]
    0.0 [ 0.2   0.54  0.26]
    0.2 [ 0.204  0.54   0.256]
    1.0 [ 0.22  0.54  0.24]
    1.5 [ 0.205  0.55   0.245]
    2.0 [ 0.19  0.56  0.25]
    2.5 [ 0.19  0.57  0.24]
    3.0 [ 0.19  0.58  0.23]
    4.0 [ 0.17  0.62  0.21]
    4.0 [ 0.17  0.62  0.21]
    
        2
  •  2
  •   unutbu    16 年前

    使用scipy.ndimage可能有更好的方法,但下面是使用scipy.interpolate.interp1d的方法:

    import numpy as np
    import scipy.interpolate as spi
    
    #                      A    B    C         Y
    my_arr = np.array([ [.20, .54, .26],     # 0
                        [.22, .54, .24],     # 1
                        [.19, .56, .25],     # 2
                        [.19, .58, .23],     # 3
                        [.17, .62, .21] ])
    
    print(my_arr)
    Y=np.arange(len(my_arr))
    interp_funcs=[spi.interp1d(Y,my_arr[:,col]) for col in range(3)]
    y=np.array([2.5,0.2,1.5,4.0,8.7])
    y[y < 0] = 0
    y[y > 4] = 4
    print(np.vstack(f(y) for f in interp_funcs))
    # [[ 0.19   0.204  0.205  0.17   0.17 ]
    #  [ 0.57   0.54   0.55   0.62   0.62 ]
    #  [ 0.24   0.256  0.245  0.21   0.21 ]]