эффективное удержание нулевого порядка - PullRequest
4 голосов
/ 17 января 2012

Есть ли эффективный способ повторной выборки массива numpy с использованием удержания нулевого порядка?В идеале что-то с такой подписью, как numpy.interp ?

Мне известно о scipy.interpolate.interp1d , но я уверен, что векторизацияАльтернатива будет доступна для решения таких случаев.

Ответы [ 3 ]

5 голосов
/ 17 января 2012

Поскольку вы не будете интерполировать какие-либо новые значения, вы не можете просто оставить исходный массив как есть и проиндексировать его с помощью некоторого пользовательского доступа-оболочки? Вы можете использовать нецелую индексацию числовых массивов.

Чтобы понять, что я имею в виду, с x = np.array(range(10)), то, например, (x[i] for i in np.linspace(0, len(x)-1, num=25)) будет что-то вроде удержания нулевого порядка.

0 голосов
/ 13 декабря 2014

Вот бесплатная версия с той же подписью. Данные должны располагаться в возрастающем порядке - б / у они сбрасываются по мере того, как вы используете «умное» использование списка в качестве вложенной функции по умолчанию (с коэффициентом ускорения 100):

def interp0(x, xp, yp):
    """Zeroth order hold interpolation w/ same
    (base)   signature  as numpy.interp."""
    from collections import deque

    def func(x0, xP=deque(xp), yP=deque(yp)):
      if x0 <= xP[0]:
        return yP[0]
      if x0 >= xP[-1]:
        return yP[-1]    
      while x0 > xP[0]:
        xP.popleft()     # get rid of default
        y = yP.popleft() # data as we go.
      return y

return map(func, x)
0 голосов
/ 31 марта 2014

Немного опоздал на вечеринку, но вот что я придумал:

from numpy import zeros, array, sign

def signal_zoh(x,y,epsilon = 0.001):
    """
        Fills in the data from a Zero-Order Hold (stair-step) signal
    """
    deltaX = array(x[1:],dtype='float') - x[:-1]
    fudge = min(deltaX) *epsilon
    retX = zeros((len(x)*2-1,))
    retY = zeros((len(y)*2-1,))
    retX[0::2] = x
    retX[1::2] = x[1:]+fudge*sign(deltaX)
    retY[0::2] = y
    retY[1::2] = y[:-1]
    return retX,retY
...