2015-11-10 12 views
5

Şekli 26*43264 olan bir dizi numaram var. Bunu 208*208 şeklinde bir dizi içine, ancak 26*26 parçalarına yeniden şekillendirmek istiyorum. Diziyi kare dizisine yeniden şekillendirme Python

[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[10,11,12,13,14,15,16,17,18,19]] 

olur gibi bir şey:

[[0, 1, 2, 3, 4], 
[10,11,12,13,14], 
[ 5, 6, 7, 8, 9], 
[15,16,17,18,19]] 
+0

'43264 = 208 * 208'den bu yana dizinizi 26 * 208 * 208'lik bir şekle yeniden biçimlendirebilirsiniz, ancak '208 * 208 * 26 * 26' – toine

+0

sadece np.reshape (liste) , (4,5)) '? – SirParselot

+0

Sadece np.reshape işlevi (liste, (4,5)), verileri yanlış şekilde bölümlendirdiği için çalışmaz. – Chidwack

cevap

3

Bu yeniden biçimlendirme sorusu daha önce ortaya çıktı.

In [473]: x=np.arange(20).reshape(2,10) 
In [474]: x 
Out[474]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]) 

Kullanım yeniden şekillendirme boyutlarını yeniden düzenlemek için devrik 5

In [475]: x.reshape(2,2,5) 
Out[475]: 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9]], 

     [[10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

ait bloklara bölmek ve kullanımı: Ama daha ziyade aramasından daha çabuk senin numune dizisi yapmak bir numpy yaklaşım

sergilmektedirler edeceğiz ve geçerli satırları

In [476]: x.reshape(2,2,5).transpose(1,0,2) 
Out[476]: 
array([[[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14]], 

     [[ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]]) 

ve dezavantajları bir başka şekli yeniden sıralama Bu devrik 1 2 boyutlara

In [477]: x.reshape(2,2,5).transpose(1,0,2).reshape(4,5) 
Out[477]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

x zaten numpy dizisi ise, olidate ve yeniden şekillendirmek operasyonlar ucuz (zaman bilge) bulunmaktadır. Eğer x gerçekten yuvalanmış listeler olsaydı, o zaman bir numpy dizisi ek yükü vardır, çünkü liste işlemleri ile diğer çözüm daha hızlı olacaktır.

1

Biraz çirkin, ancak burada tam boyutlu bir için değiştirmek mümkün olmalıdır küçük örneğin bir tek satırlık var:

In [29]: from itertools import chain 

In [30]: np.array(list(chain(*[np.arange(20).reshape(4,5)[i::2] for i in xrange(2)]))) 
Out[30]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

DÜZENLEME: İşte bir işlevde daha genelleştirilmiş bir sürüm. Uglier kodu, ancak fonksiyon sadece bir dizi ve sonuna kadar yapmak istediğiniz bir dizi parça alır.

In [57]: def break_arr(arr, chunks): 
    ....:  to_take = arr.shape[1]/chunks 
    ....:  return np.array(list(chain(*[arr.take(xrange(x*to_take, x*to_take+to_take), axis=1) for x in xrange(chunks)]))) 
    ....: 

In [58]: arr = np.arange(40).reshape(4,10) 

In [59]: break_arr(arr, 5) 
Out[59]: 
array([[ 0, 1], 
     [10, 11], 
     [20, 21], 
     [30, 31], 
     [ 2, 3], 
     [12, 13], 
     [22, 23], 
     [32, 33], 
     [ 4, 5], 
     [14, 15], 
     [24, 25], 
     [34, 35], 
     [ 6, 7], 
     [16, 17], 
     [26, 27], 
     [36, 37], 
     [ 8, 9], 
     [18, 19], 
     [28, 29], 
     [38, 39]]) 

In [60]: break_arr(arr, 2) 
Out[60]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [20, 21, 22, 23, 24], 
     [30, 31, 32, 33, 34], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19], 
     [25, 26, 27, 28, 29], 
     [35, 36, 37, 38, 39]]) 
+0

Peki bu, daha büyük bir tam sayı dizisi ile çalışmaya nasıl uyarlanır? – Chidwack

+0

Düzenleme, kullanımını biraz kolaylaştırır. –

+0

Mükemmel! teşekkür ederim – Chidwack

İlgili konular