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.
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:
[array([0, 1]), array([2, 3]), array([4, 5])]
TrueMari kita uraikan:
- Baris 3 (
np.arange(6)): array enam elemen(0..5)dibuat sebagai bahan uji. - 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). - Baris 5 (
np.array_equal(...)): menyambung kembali semua potongan dengannp.concatenatemenghasilkan array yang sama persis dengana, terbukti dari nilaiTrue. 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.
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:
[10 20]
[30 40 50]
[60]Cara membaca titik potong [2, 5]:
- Bagian pertama: irisan
[:2], yaitu dua elemen awal[10 20]. - Bagian kedua: irisan
[2:5], yaitu[30 40 50]. - 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.
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:
ValueError: array split does not result in an equal division
[0 1 2] 3
[3 4] 2
[5 6] 2Aturan 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).
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:
[[0 1]
[2 3]]
[[4 5]
[6 7]]
(4, 1) (4, 1)Penjelasan contoh di atas:
- Baris 3 (
np.arange(8).reshape(4, 2)): matriks empat baris dua kolom dibuat; keduanya habis dibagi 2 sehingga pemecahan merata dimungkinkan. - Baris 4 (
np.vsplit(m, 2)): hasilnya list berisi dua array(2, 2); list tersebut langsung dibongkar ke variabelatasdanbawah. - Baris 7 (
np.hsplit(m, 2)): pemotongan menyamping menghasilkan dua array(4, 1), yaitu kolom kiri dan kolom kananm.
| Fungsi | Arah pemotongan | Pembagian merata |
|---|---|---|
np.split | sumbu yang diberikan (axis=0 default) | wajib |
np.vsplit | baris (axis=0) | wajib |
np.hsplit | kolom (axis=1; pada 1-D sepanjang array) | wajib |
np.array_split | sumbu yang diberikan | tidak 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.