首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >X值到特定范围的指数插值

X值到特定范围的指数插值
EN

Stack Overflow用户
提问于 2018-02-21 00:02:26
回答 1查看 811关注 0票数 0

我有以下问题。我有一个包含x值的数组。现在,它们都应该通过指数函数转换为一个新的数字范围。该函数需要是数组友好的,因此输入可以是整个数组。我需要一个函数,在那里你可以改变应该改变的范围和他们应该投射到的数字的范围。此外,如果x值超出范围,则需要一个填充值,就像scipy interp1d那样。我试着这样做:

代码语言:javascript
运行
复制
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之间的数字的情况一样:

代码语言:javascript
运行
复制
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值应该强制转换到的范围数为负,或者导致负指数函数,如for range:

代码语言:javascript
运行
复制
interV1 = -1, interV2 =-15
interV1 = 1, interV2 =-17
interV1 = -20, interV2 = 20
interV1 = 20, interV2 = 2

我该如何改变我的方法,使其适用于这些情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-21 00:31:21

指数函数不能产生负数。有几种可能性可供选择,但一种简单的方法是对间隔应用移位,使其始终从1开始,然后在结束时撤消移位。当为interV1 > interV2时,您可以对这两个数字求反,然后应用此移位,稍后撤消。所以最终它可能是这样的:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48889382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档