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

给定位置的两个numpy数组之间的中间值

  •  0
  • musicamante  · 技术社区  · 6 年前

    我有两个一维numpy数组,它们是不同“时间”点上波形的整数表示。

    first = array([0, 16, 24, -32, ...])
    last = array([0, -16, -24, 32, ...])
    

    每个波阵都有一个索引,我需要计算这些值在不同点之间的中间值。例如,如果 first 位于索引0和 last 在索引3处,我需要计算0.25、0.50和0.75处的位置,给出这些数组:

    valuesAt25 = array([0, 8, 12, -16, ...])
    valuesAt50 = array([0, 0, 0, 0, ...])
    valuesAt75 = array([0, -8, -12, 16, ...])
    

    不幸的是,我找到的唯一功能是 numpy.percentile 因为它根据最低值计算百分位数。

    看来我能做点什么 scipy.interp1d 但是,由于我将该程序作为Windows和MacOS的捆绑包发布,所以我希望避免只为一个函数添加整个scipy包。

    我可以手动计算值,但这需要更多的时间(每个数组有128个值,最多可以有30个排列),而且我在numpy中找不到其他函数。另外,将来可能需要动态计算这些值,而其他波已经在音频缓冲区中播放,因此不建议使用纯Python计算。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Thijs van Ede    6 年前

    您可以定义自己的函数:

    import numpy as np
    
    def percentile(a, b, percentile):
        return (1-percentile)*a + percentile*b
    
    a = np.array([0, 16, 24, -32])
    b = np.array([0, -16, -24, 32])
    
    valuesAt25 = percentile(a, b, 0.25)
    valuesAt50 = percentile(a, b, 0.5)
    valuesAt75 = percentile(a, b, 0.75)
    
        2
  •  1
  •   m.willi    6 年前

    如果您不想使用scipy包,并且想快速执行您的程序,您应该尝试cython模块。在那里你可以建立你自己的插值模块,然后把它翻译成C代码,这可以提高你的速度。例如:

    cimport cython
    @cython.boundscheck(False)
    @cython.cdivision(True)
    cdef double interpol_2D(double[:] x_ax, double[:] y_ax, double x_val):
        cdef int i, pos, length
        length = len(x_ax)
        for i in range(length):
            if x_val <= x_ax[i]:
                pos = i-1
                break
        if pos < 0:
            pos = 0
        if pos > length-2:
            pos = length-2
        return y_ax[pos]+(y_ax[pos+1]-y_ax[pos])/(x_ax[pos+1]-x_ax[pos])*(x_val-x_ax[pos]) 
    

    也许您需要编辑算法部分,该部分指示用于计算的两个相关值的位置。我现在不知道数组中的值是如何组织的。