x 值到特定范围的指数插值
Exponential Interpolation of x values to a specific range
我有以下问题。我有一个包含 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
我有以下问题。我有一个包含 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