Suddivisione matrice - numpy

Pubblicità

Tommaso Sala

Utente Attivo
Messaggi
868
Reazioni
140
Punteggio
46
Ho una matrice di dimensione variabile e ho bisogno di suddividerla in x parti uguale al numero di colonne della matrice/numero di righe della matrice, ma non penso che sia rilevanti adesso. Esempio: una matrice con 100 colonne e 10 righe la vorrei suddivedere in 10 quadrati. L'altezza delle nuove matrici è sempre uguale a qualla dell matrice madre.
Come faccio ad ottenerle, considerando che il numero delle nuove matrici può variare?
 
Praticamente data una matrice di N righe e M colonne, vuoi creare delle sottomatrici quadrate di dimensione NxN. Es nel tuo caso 10x100 -> 10 matrici 10x10, oppure 5x60 -> 12 matrici 5x5, oppure 8x40 -> 5 matrici 8x8... Questo ovviamente ti riesce bene solo se il numero di colonne è multiplo del numero di righe.
Non è difficile, basta usare lo slicing di numpy:
Python:
import numpy as np

M = np.ones((10,100))  #la matrice da elaborare 10x100
matrici = [M[:, c:c + M.shape[0]] for c in np.arange(0, M.shape[1], M.shape[0])]
Funziona anche se il numero di colonne non è multiplo del numero di righe, in questo caso però l'ultima matrice avrà un numero di colonne inferiore a N, ovvero M mod N.
 
Ultima modifica:
Codice:
matrici = [M[:, c:c + M.shape[0]] for c in np.arange(0, M.shape[1], M.shape[0])]
Funziona anche se il numero di colonne non è multiplo del numero di righe, in questo caso però l'ultima matrice avrà un numero di colonne inferiore a N, ovvero M mod N.
Ti ringrazio per la risposta.
 
Ultima modifica:
Intanto di ringrazio per la risposta.
Onestamente ho capito ben poco di quella linea di codice, ma adesso guardo la documentazione per chiarirmi. In ogni caso per continuare a il progetto stamattina, cosa devo fare per ottenere 20 matrici, che abbiano colonne = 1/2 numero di righe cioè per questo esempio 10x5?
Per un numpy.array in due dimensioni (una matrice), lo slicing permette di estrarre sottomatrici nel seguente modo:
Python:
M[a:b,c:d]
dove a e b indicano l'intervallo di righe da selezionare, mentre c e d indicano l'intervallo di colonne. Se a e b vengono omesse, come nell'esempio, si intendono tutte le righe. Detto questo, il codice che ho riportato sopra non fa altro che estrarre sottomatrici ciclando sull'intervallo di colonne: c:c+10 , c+10:c+20, c+20:c+30... M.shape è una lista che contiene le dimensioni della matrice, quindi M.shape[0] è il numero di righe, M.shape[1] il numero di colonne. numpy.arange è come il range standard di python, numpy.arange(a, b, c) significa "parti dal valore di a e somma c finchè non arrivi al valore di b.
Detto questo, dovrebbe esserti immediato intuire come continuare il progetto. Se ti servono matrici che abbiano un numero di colonne pari a metà del numero di righe, anzichè ciclare a passi di M.shape[0], cicli di M.shape[0]//2.
Per semplicità considera una matrice come questa:
Python:
M = [[ 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]]
matrici = [M[:,c:c + M.shape[0]//2] for c in np.arange(0,M.shape[1],M.shape[0]//2)]
for m in matrici:
    print(m)
stamperà
Codice:
[[ 0  1]
 [24 25]
 [48 49]
 [72 73]]
[[ 2  3]
 [26 27]
 [50 51]
 [74 75]]
[[ 4  5]
 [28 29]
 [52 53]
 [76 77]]
[[ 6  7]
 [30 31]
 [54 55]
 [78 79]]
...
 
Pubblicità
Pubblicità
Indietro
Top