我有两个一维的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计算。
答案 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])
也许您需要编辑算法部分,该部分指示用于计算的两个相关值的位置。我现在不了解数组中值的组织方式。