2016-10-17 26 views
8

私はPython Numpy配列配列を持っているといいますか?次のように私は結果行列3.ストライドで長さ5のこの配列からサブシーケンスのマトリックスを作成したい与えられたストライド/ stepsizeでnumpy配列からサブ配列を取る

numpy.array([1,2,3,4,5,6,7,8,9,10,11].) 

は、それゆえになります。

これを実現するための1つの可能な方法は次のようになり
numpy.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]]) 

をforループを使用します。

result_matrix = np.zeros((3, 5)) 
for i in range(0, len(a), 3): 
    result_matrix[i] = a[i:i+5] 

これを実装するクリーナーの方法はNumpyですか。

答えて

15

アプローチ#1:broadcasting使用 -

def broadcasting_app(a, L, S): # Window len = L, Stride len/stepsize = S 
    nrows = ((a.size-L)//S)+1 
    return a[S*np.arange(nrows)[:,None] + np.arange(L)] 

アプローチ#2:より効率的な使用NumPy strides -

def strided_app(a, L, S): # Window len = L, Stride len/stepsize = S 
    nrows = ((a.size-L)//S)+1 
    n = a.strides[0] 
    return np.lib.stride_tricks.as_strided(a, shape=(nrows,L), strides=(S*n,n)) 

サンプル実行 -

In [143]: a 
Out[143]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 

In [144]: broadcasting_app(a, L = 5, S = 3) 
Out[144]: 
array([[ 1, 2, 3, 4, 5], 
     [ 4, 5, 6, 7, 8], 
     [ 7, 8, 9, 10, 11]]) 

In [145]: strided_app(a, L = 5, S = 3) 
Out[145]: 
array([[ 1, 2, 3, 4, 5], 
     [ 4, 5, 6, 7, 8], 
     [ 7, 8, 9, 10, 11]]) 
+0

おかげで、 私はこの試み:今 X = np.arange(100) Y = strided_app予想されるようにYを与える(X、4、1) 、および: Z = strided_app(Y、8、4)位私は長さ8とステップ4の移動ウィンドウでZをYに見せたいが、これはジャンクになる。あなたは間違いないでしょうか? – volatile

+0

@volatileあなたは 'Z'であなたが何を期待しているのかよくわかりません。 'Z = strided_app(X、8、4)'は希望の 'Z'を与えますか?代わりに 'Z'を3D配列として期待していますか? – Divakar

+0

'strided_app(np.array([np.arange(6)])、3,1)'から狂った結果も出ますか? Anacondaでpython 3.6とnumpy 1.13.1を使用しています。 – Ziofil

関連する問題