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

时间:2018-07-24 12:25:08

标签: python numpy

我有两个一维的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 个答案:

答案 0 :(得分:2)

您可以定义自己的功能:

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)

答案 1 :(得分:1)

如果您不想使用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]) 

也许您需要编辑算法部分,该部分指示用于计算的两个相关值的位置。我现在不了解数组中值的组织方式。