Есть ли буферный эквивалент Matlab в numpy?

python matlab numpy buffer

1501 просмотра

3 ответа

2789 Репутация автора

Я вижу , есть array_splitи split методы , но это не очень удобно , когда вы должны разделить массив длины , которое не является целым числом , кратным размеру порции. Кроме того, эти входные методы - это количество слайсов, а не их размер. Мне нужно что-то более похожее на буферный метод Matlab, который больше подходит для обработки сигналов.

Например, если я хочу буферизовать сигналы для блоков размером 60, мне нужно сделать: np.vstack(np.hsplit(x.iloc[0:((len(x)//60)*60)], len(x)//60))что является громоздким.

Автор: Hanan Shteingart Источник Размещён: 19.07.2016 08:30

Ответы (3)


5 плюса

8351 Репутация автора

Я написал следующую подпрограмму для обработки нужных мне вариантов использования, но я не реализовал / не проверил на «недопонимание».

Пожалуйста, не стесняйтесь вносить предложения по улучшению.

def buffer(X, n, p=0, opt=None):
    '''Mimic MATLAB routine to generate buffer array

    MATLAB docs here: https://se.mathworks.com/help/signal/ref/buffer.html

    Parameters
    ----------
    x: ndarray
        Signal array
    n: int
        Number of data segments
    p: int
        Number of values to overlap
    opt: str
        Initial condition options. default sets the first `p` values to zero,
        while 'nodelay' begins filling the buffer immediately.

    Returns
    -------
    result : (n,n) ndarray
        Buffer array created from X
    '''
    import numpy as np

    if opt not in [None, 'nodelay']:
        raise ValueError('{} not implemented'.format(opt))

    i = 0
    first_iter = True
    while i < len(X):
        if first_iter:
            if opt == 'nodelay':
                # No zeros at array start
                result = X[:n]
                i = n
            else:
                # Start with `p` zeros
                result = np.hstack([np.zeros(p), X[:n-p]])
                i = n-p
            # Make 2D array and pivot
            result = np.expand_dims(result, axis=0).T
            first_iter = False
            continue

        # Create next column, add `p` results from last col if given
        col = X[i:i+(n-p)]
        if p != 0:
            col = np.hstack([result[:,-1][-p:], col])
        i += n-p

        # Append zeros if last row and not length `n`
        if len(col) < n:
            col = np.hstack([col, np.zeros(n-len(col))])

        # Combine result with next row
        result = np.hstack([result, np.expand_dims(col, axis=0).T])

    return result
Автор: ryanjdillon Размещён: 18.10.2016 10:38

0 плюса

1 Репутация автора

То же, что и другой ответ, но быстрее.

def buffer(X, n, p=0):

    '''
    Parameters
    ----------
    x: ndarray
        Signal array
    n: int
        Number of data segments
    p: int
        Number of values to overlap

    Returns
    -------
    result : (n,m) ndarray
        Buffer array created from X
    '''
    import numpy as np

    d = n - p
    m = len(X)//d

    if m * d != len(X):
        m = m + 1

    Xn = np.zeros(d*m)
    Xn[:len(X)] = X

    Xn = np.reshape(Xn,(m,d))
    Xne = np.concatenate((Xn,np.zeros((1,d))))
    Xn = np.concatenate((Xn,Xne[1:,0:p]), axis = 1)

    return np.transpose(Xn[:-1])
Автор: Ali Khodabakhsh Размещён: 26.02.2019 03:28

1 плюс

11 Репутация автора

def buffer(X = np.array([]), n = 1, p = 0):
    #buffers data vector X into length n column vectors with overlap p
    #excess data at the end of X is discarded
    n = int(n) #length of each data vector
    p = int(p) #overlap of data vectors, 0 <= p < n-1
    L = len(X) #length of data to be buffered
    m = int(np.floor((L-n)/(n-p)) + 1) #number of sample vectors (no padding)
    data = np.zeros([n,m]) #initialize data matrix
    for startIndex,column in zip(range(0,L-n,n-p),range(0,m)):
        data[:,column] = X[startIndex:startIndex + n] #fill in by column
    return data
Автор: Andrzej May Размещён: 14.08.2019 09:28
Вопросы из категории :
32x32