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

在python/numpy/scipy中查找两个数组之间的插值交集

  •  0
  • splinter  · 技术社区  · 7 年前

    我正在寻找一种简单的方法来查找两个numpy数组之间的插值交集。我知道,如果我们有两个函数句柄,而不是两个数组,这很简单,如 this 使用scipy或sympy链接。我想做同样的事情,但是给出了两个数组,特别是线性样条线之间的数组,这是由按行连接数组条目产生的。

    例如,假设我们有两个数组, y_1 y_2 ,两者都是在 xSupport .

    import numpy as np
    xSupport = np.array([0,1])
    y_1 = np.array([0,2])
    y_2 = np.array([1,0])
    

    我正在查找返回的函数 1/3 ,这是这两条线相交处的x值。在我的应用程序中,支持大于两个,所以我正在寻找一种独立于数组长度的方法。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Cory Nezin    7 年前

    按照SER的回答:

    import numpy as np
    x = np.array([0,1])
    y1 = np.array([0,2])
    y2 = np.array([1,0])
    
    def solve(f,x):
        s = np.sign(f)
        z = np.where(s == 0)[0]
        if z:
            return z
        else:
            s = s[0:-1] + s[1:]
            z = np.where(s == 0)[0]
            return z
    
    def interp(f,x,z):
        m = (f[z+1] - f[z]) / (x[z+1] - x[z])
        return x[z] - f[z]/m
    
    f = y1-y2
    z = solve(f,x)
    ans = interp(f,x,z)
    
    print(ans)
    

    这个问题可以通过假设你找到一个零,然后对两个级数的差执行函数来简化。首先,“solve”查找符号转换发生的位置(意味着在中间的某个位置出现零),然后“interp”执行线性插值以查找解决方案。

        2
  •  1
  •   Warren Weckesser    7 年前

    在…上面 Digitizing an analog signal ,我创建了一个名为 find_transition_times . 您可以通过传递 y_1 - y_2 对于 y 0 对于 threshold :

    In [5]: xSupport = np.array([0,1])
       ...: y_1 = np.array([0,2])
       ...: y_2 = np.array([1,0])
       ...: 
    
    In [6]: find_transition_times(xSupport, y_1 - y_2, 0)
    Out[6]: array([ 0.33333333])