Kebalikan dari menggabungkan adalah memecah. Sering kali array yang besar perlu dibagi menjadi potongan-potongan lebih kecil: memproses data per batch, memisahkan segmen atas dan bawah sebuah tabel, atau memotong catatan penjualan pada indeks tertentu. NumPy menyediakan keluarga fungsi split untuk keperluan ini; np.split adalah bentuk utamanya, sedangkan np.array_split adalah versinya yang mengizinkan pembagian tidak merata.

Bab ini membahas dua cara memanggil np.split (jumlah bagian dan daftar indeks), kesalahan yang muncul saat pembagian tidak merata, solusi dengan np.array_split, serta fungsi turunan np.vsplit dan np.hsplit.

Memecah Merata dengan np.split #

Bentuk pemanggilan paling dasar memberikan satu bilangan bulat sebagai argumen kedua: array dibagi menjadi sebanyak itu bagian dengan panjang yang sama persis.

python
import numpy as np

a = np.arange(6)
bagian = np.split(a, 3)
print(bagian)
print(np.array_equal(a, np.concatenate(bagian)))

Output yang Dihasilkan:

text
[array([0, 1]), array([2, 3]), array([4, 5])]
True

Mari kita uraikan:

  1. Baris 3 (np.arange(6)): array enam elemen (0..5) dibuat sebagai bahan uji.
  2. Baris 4 (np.split(a, 3)): hasilnya berupa list Python berisi tiga array, masing-masing (2,); syaratnya panjang array (6) habis dibagi jumlah bagian (3).
  3. Baris 5 (np.array_equal(...)): menyambung kembali semua potongan dengan np.concatenate menghasilkan array yang sama persis dengan a, terbukti dari nilai True. Pola putar-balik split lalu concatenate ini jadi bukti bahwa pemecahan tidak menghilangkan satu elemen pun.

Memotong pada Indeks Tertentu #

Argumen kedua np.split juga menerima daftar indeks sebagai titik-titik potong. Dengan daftar berisi n indeks, array terbagi menjadi n + 1 bagian.

python
import numpy as np

penjualan = np.array([10, 20, 30, 40, 50, 60])
potongan = np.split(penjualan, [2, 5])
for p in potongan:
    print(p)

Output yang Dihasilkan:

text
[10 20]
[30 40 50]
[60]

Cara membaca titik potong [2, 5]:

  1. Bagian pertama: irisan [:2], yaitu dua elemen awal [10 20].
  2. Bagian kedua: irisan [2:5], yaitu [30 40 50].
  3. Bagian ketiga: irisan [5:], yaitu sisa [60]; bagian terakhir boleh kosong bila titik potong terletak di ujung luar panjang array.

Ketika Pembagian Tidak Merata #

np.split bersikap ketat: bila panjang array tidak habis dibagi jumlah bagian, fungsi ini memunculkan ValueError alih-alih menghasilkan bagian yang tidak seimbang. Fungsi np.array_split menerima permintaan yang sama tanpa protes; bagian-bagian awal dibuat lebih besar agar semua elemen terbagi habis.

python
import numpy as np

a = np.arange(7)
try:
    np.split(a, 3)
except ValueError as e:
    print("ValueError:", e)
bagian = np.array_split(a, 3)
for p in bagian:
    print(p, len(p))

Output yang Dihasilkan:

text
ValueError: array split does not result in an equal division
[0 1 2] 3
[3 4] 2
[5 6] 2

Aturan pembagian np.array_split mudah diprediksi. Dengan panjang array s dan jumlah bagian q, sisa s % q didistribusikan satu per satu ke bagian-bagian terdepan. Pada contoh di atas 7 % 3 = 1, sehingga satu bagian pertama berisi 3 elemen dan dua bagian sisanya masing-masing 2 elemen; memecah 10 elemen menjadi 4 bagian menghasilkan ukuran 3, 3, 2, 2.

vsplit dan hsplit #

Keluarga split juga punya versi searah sumbu pada array dua dimensi: np.vsplit memotong searah baris (setara np.split dengan axis=0), sedangkan np.hsplit memotong menyamping searah kolom (setara axis=1).

python
import numpy as np

m = np.arange(8).reshape(4, 2)
atas, bawah = np.vsplit(m, 2)
print(atas)
print(bawah)
kiri, kanan = np.hsplit(m, 2)
print(kiri.shape, kanan.shape)

Output yang Dihasilkan:

text
[[0 1]
 [2 3]]
[[4 5]
 [6 7]]
(4, 1) (4, 1)

Penjelasan contoh di atas:

  1. Baris 3 (np.arange(8).reshape(4, 2)): matriks empat baris dua kolom dibuat; keduanya habis dibagi 2 sehingga pemecahan merata dimungkinkan.
  2. Baris 4 (np.vsplit(m, 2)): hasilnya list berisi dua array (2, 2); list tersebut langsung dibongkar ke variabel atas dan bawah.
  3. Baris 7 (np.hsplit(m, 2)): pemotongan menyamping menghasilkan dua array (4, 1), yaitu kolom kiri dan kolom kanan m.
FungsiArah pemotonganPembagian merata
np.splitsumbu yang diberikan (axis=0 default)wajib
np.vsplitbaris (axis=0)wajib
np.hsplitkolom (axis=1; pada 1-D sepanjang array)wajib
np.array_splitsumbu yang diberikantidak wajib, bagian awal lebih besar

Pola kerja yang lazim di lapangan adalah memecah dengan split, memproses tiap potongan secara terpisah, lalu menyatukan hasilnya kembali dengan np.concatenate — cara kerja np.concatenate sudah dibahas pada Chapter concatenate.