2017-06-01 5 views
2

as_stridedからnumpy.lib.stride_tricksまでのサブシリーズを抽出するのに苦労していますが、 strides引数の場合NumPyストライドを使用して3D配列に2D配列の最後の軸に沿ってウィンドウをスライドさせて

私は、長さ(a=)10の5D配列を含むmという行列を持っているとしましょう。 mの各1D配列の長さ(b=)4のサブ1D配列を抽出したいと思います。

import numpy 
from numpy.lib.stride_tricks import as_strided 

a, b = 10, 4 
m = numpy.array([range(i,i+a) for i in range(5)]) 

# first try 
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b)) 
print sub_m.shape # (5,7,4) which is what i expected 
print sub_m[-1,-1,-1] # Some unexpected strange number: 8227625857902995061 

# second try with strides argument 
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b), strides=(m.itemize,m.itemize,m.itemize)) 
# gives error, see below 

AttributeError: 'numpy.ndarray' object has no attribute 'itemize'

あなたは私が私の最初の試みでsub_mのための右の形状を得るために成功する見ることができるように。しかし、私は情報についてstrides=()

に書くために何を見つけることができません。

m = [[ 0 1 2 3 4 5 6 7 8 9] 
[ 1 2 3 4 5 6 7 8 9 10] 
[ 2 3 4 5 6 7 8 9 10 11] 
[ 3 4 5 6 7 8 9 10 11 12] 
[ 4 5 6 7 8 9 10 11 12 13]] 

予想される出力:

sub_n = [ 
     [[0 1 2 3] [1 2 3 4] ... [5 6 7 8] [6 7 8 9]] 
     [[1 2 3 4] [2 3 4 5] ... [6 7 8 9] [7 8 9 10]] 
     [[2 3 4 5] [3 4 5 6] ... [7 8 9 10] [8 9 10 11]] 
     [[3 4 5 6] [4 5 6 7] ... [8 9 10 11] [9 10 11 12]] 
     [[4 5 6 7] [5 6 7 8] ... [9 10 11 12] [10 11 12 13]] 
     ] 

編集:、それはなぜな理由私はより多くのデータを持っています使用したいas_strided(効率)

+0

期待される出力の形状は何ですか?入力にshape(m、n)があり、ストライド長が 'L'となっているとします。 – Divakar

+0

予想される出力形状:(5,7,4)(m、n、L)、L = m-4 + 1 – Nuageux

+0

多分あなたは(m、n-L + 1、L)を意味しますか? – Divakar

答えて

1

での1つのアプローチからas_stridedためのストライドに説明の

def strided_lastaxis(a, L): 
    s0,s1 = a.strides 
    m,n = a.shape 
    return np.lib.stride_tricks.as_strided(a, shape=(m,n-L+1,L), strides=(s0,s1,s1)) 

ビット:

我々は、3Dストライドを持つ最後の/第3の軸に沿って一つの要素、最後の軸の大股歩きのためにそこにそうs1インクリメント。第2軸は、同じ1つの要素 "距離"で進んでいるので、それもs1です。最初の軸では、ストライドは配列の最初の軸ストライド長と同じです。次の行に移動するので、s0がそこにあります。

サンプル実行 -

In [46]: a 
Out[46]: 
array([[0, 5, 6, 2, 3, 6, 7, 1, 4, 8], 
     [2, 1, 3, 7, 0, 3, 5, 4, 0, 1]]) 

In [47]: strided_lastaxis(a, L=4) 
Out[47]: 
array([[[0, 5, 6, 2], 
     [5, 6, 2, 3], 
     [6, 2, 3, 6], 
     [2, 3, 6, 7], 
     [3, 6, 7, 1], 
     [6, 7, 1, 4], 
     [7, 1, 4, 8]], 

     [[2, 1, 3, 7], 
     [1, 3, 7, 0], 
     [3, 7, 0, 3], 
     [7, 0, 3, 5], 
     [0, 3, 5, 4], 
     [3, 5, 4, 0], 
     [5, 4, 0, 1]]]) 
+0

ありがとう!できます。しかし、私はまだ最後の議論で何をすべきか理解していません。 '(s0、s1、s1)'はどこから来ますか?私は本当にありがとうございますので、次回は尋ねる必要はありませんので詳細を追加できます:) – Nuageux

+0

@Nuageux Heartfelt apologies Sir!コメントを追加しました。 – Divakar

+0

あなたの説明のために多くのありがとう、私がこの機能で戦っているのは初めてではありません。 (PS:なぜ?) – Nuageux

関連する問題