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

Python 给定位置的两个numpy数组之间的中间值,python,numpy,Python,Numpy,我有两个一维numpy数组,它们是不同“时间”点处波形的整数表示 每个波形数组都有一个索引,我需要计算不同点上这些值之间的中间值。例如,如果第一个位于索引0,而最后一个位于索引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数组,它们是不同“时间”点处波形的整数表示

每个波形数组都有一个索引,我需要计算不同点上这些值之间的中间值。例如,如果
第一个
位于索引0,而
最后一个
位于索引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计算。

如果您不想使用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]) 
cimport cython
@cython.boundscheck(错误)
@cython.cdivision(真)
cdef国际刑警组织双x轴双x轴双y轴双x值:
cdef int i,位置,长度
长度=长度(x_ax)
对于范围内的i(长度):
如果x_val length-2:
位置=长度-2
返回y_ax[pos]+(y_ax[pos+1]-y_ax[pos])/(x_ax[pos+1]-x_ax[pos])*(x_val-x_ax[pos])

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

如果您不想使用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]) 
cimport cython
@cython.boundscheck(错误)
@cython.cdivision(真)
cdef国际刑警组织双x轴双x轴双y轴双x值:
cdef int i,位置,长度
长度=长度(x_ax)
对于范围内的i(长度):
如果x_val length-2:
位置=长度-2
返回y_ax[pos]+(y_ax[pos+1]-y_ax[pos])/(x_ax[pos+1]-x_ax[pos])*(x_val-x_ax[pos])

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

您可以定义自己的函数:

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)

您可以定义自己的函数:

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)

谢谢我没有想过使用cython(事实上,以前从未使用过)。我会考虑它的其他用途,因为它似乎是一个更简单的方法实际上是工作:谢谢;我没有想过使用cython(事实上,以前从未使用过)。我会考虑它的其他用途,因为它似乎是一个更简单的方法实际上是工作:哇。这很简单。。。而且它有效!我真的没有想到这一点(我对numpy还没有太多经验)。我会做一些进一步的测试,但初步结果是有希望的。如果一切正常,我将标记为已接受。谢谢哇!这很简单。。。而且它有效!我真的没有想到这一点(我对numpy还没有太多经验)。我会做一些进一步的测试,但初步结果是有希望的。如果一切正常,我将标记为已接受。谢谢