np.split() în NumPy

Împarte un tablou în mai multe bucăți: în părți egale (np.split), aproape egale (np.array_split) sau la anumiți indici.

Sintaxă
np.split(ary, indices_or_sections, axis=0)
np.array_split(ary, indices_or_sections, axis=0)
np.hsplit(ary, indices_or_sections)
np.vsplit(ary, indices_or_sections)

Ce face np.split()

np.split(a, n) împarte tabloul în n bucăți egale și returnează o listă de tablouri. Dacă lungimea nu se împarte exact la n, primești ValueError. np.array_split() acceptă și împărțiri inexacte: primele bucăți au câte un element în plus.

În loc de un număr poți da o listă de indici: np.split(a, [3, 7]) taie înainte de pozițiile 3 și 7 și dă bucățile a[:3], a[3:7], a[7:].

Pentru tablouri 2D, np.vsplit() taie pe orizontală (grupuri de rânduri, ca axis=0), iar np.hsplit() taie pe verticală (grupuri de coloane, ca axis=1).

Parametri

Parametru Descriere
ary Tabloul de împărțit.
indices_or_sections Un număr (câte bucăți egale) sau o listă de indici unde se taie.
axis Axa de-a lungul căreia se taie; implicit 0.

Ce returnează

O listă de tablouri (sub-tablouri care sunt vederi ale tabloului inițial).

Exemple

Exemplul 1: Un an împărțit în trimestre

import numpy as np

lunar = np.arange(1, 13) * 100
trimestre = np.split(lunar, 4)
for i, t in enumerate(trimestre, start=1):
    print(f"T{i}:", t, "total", t.sum())

Rezultat

T1: [100 200 300] total 600
T2: [400 500 600] total 1500
T3: [700 800 900] total 2400
T4: [1000 1100 1200] total 3300

Exemplul 2: split dă eroare, array_split nu

10 elevi nu se împart exact în 3 grupe: array_split face grupe de 4, 3 și 3.

import numpy as np

elevi = np.arange(1, 11)
try:
    np.split(elevi, 3)
except ValueError as e:
    print("Eroare:", e)

for grupa in np.array_split(elevi, 3):
    print(grupa)

print(np.split(elevi, [2, 5]))

Rezultat

Eroare: array split does not result in an equal division
[1 2 3 4]
[5 6 7]
[ 8  9 10]
[array([1, 2]), array([3, 4, 5]), array([ 6,  7,  8,  9, 10])]

Exemplul 3: hsplit și vsplit pe un tabel

import numpy as np

tabel = np.arange(1, 13).reshape(4, 3)
sus, jos = np.vsplit(tabel, 2)
print(sus)
print(jos)

prima, restul = np.hsplit(tabel, [1])
print(prima.ravel(), restul.shape)

Rezultat

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

Greșeli frecvente

  • Folosești np.split(a, 3) pe un tablou cu 10 elemente și primești ValueError: array split does not result in an equal division. Folosește np.array_split().
  • Crezi că lista de indici înseamnă lungimile bucăților. [2, 5] înseamnă „taie la pozițiile 2 și 5”, deci bucățile au lungimile 2, 3 și restul.
  • Modifici o bucată și te miri că s-a schimbat și tabloul inițial: bucățile sunt vederi. Folosește .copy() dacă vrei date independente.

Comenzi înrudite

  • np.concatenate(): Lipește mai multe tablouri unul după altul pe o axă existentă (axis=0 adaugă rânduri, axis=1 adaugă coloane).
  • np.stack(): Combină tablouri pe o axă nouă (np.stack), pe verticală (vstack), pe orizontală (hstack) sau ca și coloane (column_stack).
  • Copie și vedere (copy vs view): Explică diferența dintre o vedere (aceleași date) și o copie în NumPy și cum le recunoști cu .base și np.shares_memory.
  • ndarray.reshape(): Schimbă forma unui tablou (de exemplu din 12 elemente în 3 x 4) fără să-i schimbe datele.