Suddivisione matrice - numpy

Tommaso Sala

Utente Attivo
870
140
CPU
Ryzen 3 1200
Dissipatore
Stock
Scheda Madre
A320m-k
HDD
SSD 240GB + HDD 2x500GB
RAM
8gb DDR4
PSU
EVGA 500w
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?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
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:
  • Mi piace
Reazioni: Tommaso Sala

Tommaso Sala

Utente Attivo
870
140
CPU
Ryzen 3 1200
Dissipatore
Stock
Scheda Madre
A320m-k
HDD
SSD 240GB + HDD 2x500GB
RAM
8gb DDR4
PSU
EVGA 500w
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:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
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]]
...
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili