2016-10-17 18 views
8

Python Numpy dizi dizilimim var a: a.Belirtilen adım/adım boyutu verilen numpy dizisinden alt diziler alma

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

Ben sonuç matrisi dolayısıyla olarak bakacağız adımlarla 3. uzunluğunda 5 bu diziden alt dizilerin bir matris oluşturmak istiyorum aşağıdaki gibidir: olacak bu uygulama

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

olası bir yolu bir döngü kullanmak.

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

Bunu uygulamak için daha temiz bir yol var mı Numpy? -:

cevap

15

Yaklaşım # 1

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)] 

Yaklaşım # 2 broadcasting kullanma: -

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)) 

Numune çalışma - daha verimli NumPy strides kullanma

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

Teşekkür, X = np.arange (100) Y = strided_app (X, 4, 1) hemen beklendiği gibi Y verir ve : Z = strided_app (E, 8, 4) #Bu çalıştı Z yi, uzunluğu 8 ve adım 4 olan hareketli bir pencereyle Y'yi görmek istiyorum, ancak bu önemsiz bir şekilde sonuçlanır. Lütfen düzeltebilir misin? – volatile

+0

@volatile Z 'ile ne beklediğinizden emin değilim? Z = strided_app (X, 8, 4) 'istenen Z'yi verir mi? Z 'yerine 3D dizisi mi bekliyorsunuz? – Divakar

+0

Ayrıca strided_app (np.array ([np.arange (6)]), 3,1) 'dan çılgın bir sonuç alıyor musunuz? Anaconda'da python 3.6 ve numpy 1.13.1 kullanıyorum. – Ziofil

İlgili konular