2015-04-02 13 views
5

Ho dati in un array NumPy:Come funziona la rimodella numpy?

a = np.arange(100) 
a = a.reshape((20,5)) 

Quando digito

a[:10] 

restituisce

array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]]) 

Ora ho deciso di rimodellare la matrice in una matrice 3d.

b = a.reshape((5,4,5)) 

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

    [[20, 21, 22, 23, 24], 
    [25, 26, 27, 28, 29], 
    [30, 31, 32, 33, 34], 
    [35, 36, 37, 38, 39]], 

    [[40, 41, 42, 43, 44], 
    [45, 46, 47, 48, 49], 
    [50, 51, 52, 53, 54], 
    [55, 56, 57, 58, 59]], 

    [[60, 61, 62, 63, 64], 
    [65, 66, 67, 68, 69], 
    [70, 71, 72, 73, 74], 
    [75, 76, 77, 78, 79]], 

    [[80, 81, 82, 83, 84], 
    [85, 86, 87, 88, 89], 
    [90, 91, 92, 93, 94], 
    [95, 96, 97, 98, 99]]]) 

Come si configura b per ottenere i valori come [: 10]? Ho provato

b[:10,0,:5] 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [20, 21, 22, 23, 24], 
     [30, 31, 32, 33, 34], 
     [40, 41, 42, 43, 44], 
     [50, 51, 52, 53, 54], 
     [60, 61, 62, 63, 64], 
     [70, 71, 72, 73, 74], 
     [80, 81, 82, 83, 84], 
     [90, 91, 92, 93, 94]]) 

Ma non è corretto. Grazie in anticipo!

+0

Vuoi una matrice con 10 righe con numeri da 0 a 50? ma questo è ciò che rimodella è per ... b.reshape ((20,5)) [: 10] –

+0

Sei sicuro che 'b' assomiglia a questo? Ottengo qualcosa di diverso ... Penso che tu abbia invece 'b = a.reshape (10,2,5)' – plonser

+0

'b' sembra un' (10,2,5) 'rimodella – hpaulj

risposta

6

Quando si utilizza b = a.reshape((5,4,5)) è sufficiente creare una vista diversa sugli stessi dati utilizzati dall'array a. (Ad esempio, le modifiche apportate agli elementi di a verranno visualizzate in b). reshape() non copia i dati in questo caso, quindi è un'operazione molto veloce. Affettare b e affettare a accede alla stessa memoria, quindi non ci dovrebbe essere alcuna necessità di una sintassi diversa per l'array b (basta usare a[:10]). Se hai hai creato una copia dei dati, forse con np.resize(), e scartato a, solo rimodellare b: b.reshape((20,5))[:10].

+0

Non c'è modo di tagliare b per ottenere un [: 10]? – dnth

+1

L'array 'b' è diviso in 5 blocchi di 4 righe, 5 colonne ciascuno. Vuoi tutte le voci dai primi 2 blocchi e le prime 2 righe dal terzo. Non penso che ci sia un modo semplice per suddividere questo per ottenere un singolo array 10x5 senza rimodellare. In un certo senso, rimodellare cambia semplicemente il modo in cui indicizzate la memoria, quindi per il vostro caso è uno strumento extra per affettare il modo che volete. Non è lento. – xnx

2

Rimodellando (20,5) a (5,4,5), non è possibile estrarre la prima metà dei valori. Non si può dividere quei 5 righe in 2 anche gruppi:

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

     [[20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39]]]) 

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

     [[20, 21, 22, 23, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39]], 

     [[40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49], 
     [50, 51, 52, 53, 54], 
     [55, 56, 57, 58, 59]]]) 

L'ultima fila di a[:10] è nel bel mezzo di b[3,:,:].

noti che b[:2] è (2,4,5), 8 file di a, raggruppati in 2 set di 4.

Ora, se avessi fatto c=a.reshape(4,5,5), quindi c[:2] avrebbe dovuto quelle stesse 10 righe - in 2 set di 5. E c[:2].reshape(10,-1) sarà simile a a[:10].

Problemi correlati