2016-07-19 13 views
2

array_splitsplitmethodsがありますが、チャンクサイズの整数倍でない長さの配列を分割する必要がある場合には、これらはあまり便利ではありません。さらに、これらの方法入力は、スライスサイズではなくスライス数である。信号処理に適したMatlabのbufferメソッドのようなものが必要です。numpyに相当するMatlabのバッファはありますか?

たとえば、サイズ60のチャンクに信号をバッファリングするには、私は次の操作を行う必要があります。np.vstack(np.hsplit(x.iloc[0:((len(x)//60)*60)], len(x)//60))これは面倒です。

+1

「np.split」を試しましたか?指定されたインデックスで分割されるので、不規則な間隔を処理する必要があります。範囲を使ってこれらのインデックスを作成するだけです。 – Divakar

+0

またはこれはhttps://mail.scipy.org/pipermail/scipy-user/2006-November/009962.htmlとhttps://mail.scipy.org/pipermail/scipy-user/attachments/のコードに役立つかもしれません。 20061119/292f81e3/attachment.py –

+1

'buffer'文書を一目見てみると、numpy''stride_tricks.as_strided'が思い出されます。特に重複やスキップを扱う能力があります。しかし、これはあまりにも強力で危険な場合があります。 – hpaulj

答えて

3

私は必要なユースケースを処理するために以下のルーチンを書いたが、 "underlap"の実装/テストは行っていない。

改善のためのご意見をお寄せください。

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 

    Args 
    ---- 
    x: signal array 
    n: number of data segments 
    p: number of values to overlap 
    opt: initial condition options. default sets the first `p` values 
     to zero, while 'nodelay' begins filling the buffer immediately. 
    ''' 
    import numpy 

    if p >= n: 
     raise ValueError('p ({}) must be less than n ({}).'.format(p,n)) 

    # Calculate number of columns of buffer array 
    cols = int(numpy.ceil(len(x)/float(n-p))) 

    # Check for opt parameters 
    if opt == 'nodelay': 
     # Need extra column to handle additional values left 
     cols += 1 
    elif opt != None: 
     raise SystemError('Only `None` (default initial condition) and ' 
          '`nodelay` (skip initial condition) have been ' 
          'implemented') 

    # Create empty buffer array 
    b = numpy.zeros((n, cols)) 

    # Fill buffer by column handling for initial condition and overlap 
    j = 0 
    for i in range(cols): 
     # Set first column to n values from x, move to next iteration 
     if i == 0 and opt == 'nodelay': 
      b[0:n,i] = x[0:n] 
      continue 
     # set first values of row to last p values 
     elif i != 0 and p != 0: 
      b[:p, i] = b[-p:, i-1] 
     # If initial condition, set p elements in buffer array to zero 
     else: 
      b[:p, i] = 0 

     # Get stop index positions for x 
     k = j + n - p 

     # Get stop index position for b, matching number sliced from x 
     n_end = p+len(x[j:k]) 

     # Assign values to buffer array from x 
     b[p:n_end,i] = x[j:k] 

     # Update start index location for next iteration of x 
     j = k 

    return b 
+1

マイナーチェンジしてくれました。私はPython 3(私の理論)を使用しているので、 'cols'変数は切り詰められていました。これは、Python 3が乗算をどのように扱うかの変更によるものだと考えてください。私は、 'cols'を計算する式で浮動小数点を分母にキャストし、その出力はMatlabの出力とまったく同じです。 'cols = int(np.ceil(len(x)/ float((n-p))))' – user2348114

+0

ありがとうございます。私もPython 3を使用していますが、これを使わなかったので、おそらく気付かなかったでしょう。 – ryanjdillon