x值指数插值到特定范围



我有以下问题。我有一个带有x值的数组。现在,他们都应该通过指数函数将其施放到新的数字范围内。该功能需要友好型数组,因此输入可能是整个数组。我需要一个功能,您可以在其中更改应更改的范围以及应施放它们的数字的范围。此外,如果X值不在范围之外,则需要填充值,例如Scipy Interp1d执行此操作。我尝试过这样的尝试:

def exponentialInter(x,border1,border2,interV1,interV2,fillValue):
    #x is the x Value array
    x = x.astype(np.float)
    mask1 = x<border1
    mask2 = x>border2
    mask3= np.ma.mask_or(mask1,mask2)
    x[mask3] = np.nan
    y = np.exp(np.log(interV1)+np.log(interV2/interV1)*((x-border1) / (border2-border1)))
    y = np.nan_to_num(y)
    return y 

对于导致积极指数函数的范围,这没问题,例如,对于0到5之间的所有数字,都应施放为2至20之间的数字:

print(exponentialInter(np.array([0,1,2,3,4,5,6,7,8,9,10]),0,5,2,20,0))
[ 2.          3.16978638  5.02377286  7.96214341 12.61914689 20.
  0.          0.          0.          0.          0.        ]

但是,如果x值的范围数为负或导致负指数函数,则我会遇到严重的问题:

interV1 = -1, interV2 =-15
interV1 = 1, interV2 =-17
interV1 = -20, interV2 = 20
interV1 = 20, interV2 = 2

我必须如何更改我的方法,它适用于这些情况?

指数函数无法产生负数。您可以选择几种可能性,但是一个简单的方法只是将轮班应用于间隔,以便始终从1开始,然后在末尾撤消移动。当interV1 > interV2时,您可以否定这两个数字,然后应用此转换,以后撤消。因此,最后可能是:

def exponentialInter(x, border1, border2, interV1, interV2, fillValue):
    factor = 1 if interV1 <= interV2 else -1
    interV1 *= factor
    interV2 *= factor
    shift = 1 - interV1
    interV1 += shift
    interV2 += shift
    # Computation ...
    return (y - shift) * factor

相关内容

  • 没有找到相关文章

最新更新