Chapter concatenate menunjukkan cara menempelkan array memanjang pada dimensi yang sudah ada. Ada kebutuhan lain yang tidak bisa diselesaikan dengan cara itu: menyimpan beberapa array berbentuk identik sebagai satu kesatuan bertingkat, misalnya matriks nilai dari beberapa kelas yang ingin kita pegang sebagai satu objek tiga dimensi. Untuk kebutuhan semacam ini NumPy menyediakan np.stack, fungsi yang menggabungkan array dengan cara menambahkan satu sumbu baru pada hasil.
Bab ini membahas dua fungsi. np.stack selalu menaikkan jumlah dimensi hasil sebesar satu, sedangkan np.vstack menempelkan array searah baris dan menjadi jembatan antara dunia vektor dan matriks.
Menumpuk Array dengan Sumbu Baru #
np.stack menerima list array yang bentuknya sama persis. Tanpa parameter axis (default axis=0), setiap array pada list menjadi satu irisan utuh pada sumbu pertama hasil.
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([[7, 8, 9],
[10, 11, 12]])
tumpuk = np.stack([a, b])
print(tumpuk.shape)
print(tumpuk[0])
print(tumpuk[1])Output yang Dihasilkan:
(2, 2, 3)
[[1 2 3]
[4 5 6]]
[[ 7 8 9]
[10 11 12]]Mari kita uraikan mekanismenya:
- Baris 3-6 (
np.array(...)): dua matriks berbentuk(2, 3)dibuat. Kesamaan bentuk ini wajib, sebab setiap array akan mengisi irisan yang berukuran sama. - Baris 7 (
np.stack([a, b])): NumPy menyisipkan satu sumbu baru pada posisi 0 hasil, sehingga bentuk(2, 3)berubah menjadi(2, 2, 3). Angka pertama2berasal dari banyaknya array yang ditumpuk, bukan dari isi array. - Baris 8-9 (
print(tumpuk[...])):tumpuk[0]berisiadantumpuk[1]berisib. Array asli tidak berubah; hasilnya adalah objek baru tiga dimensi.
Memilih Posisi Sumbu Baru dengan axis #
Parameter axis pada np.stack menentukan posisi penyisipan sumbu baru pada bentuk hasil, bukan memilih array mana yang ditempatkan di depan. Pada input (2, 3), nilai axis=1 menyisipkan sumbu baru di tengah sehingga bentuknya tetap (2, 2, 3) tetapi susunan isinya berubah, sedangkan axis=2 menyisipkan di posisi paling belakang dan menghasilkan (2, 3, 2).
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([[7, 8, 9],
[10, 11, 12]])
axis1 = np.stack([a, b], axis=1)
print(axis1.shape)
print(axis1)
axis2 = np.stack([a, b], axis=2)
print(axis2.shape)
print(axis2)Output yang Dihasilkan:
(2, 2, 3)
[[[ 1 2 3]
[ 7 8 9]]
[[ 4 5 6]
[10 11 12]]]
(2, 3, 2)
[[[ 1 7]
[ 2 8]
[ 3 9]]
[[ 4 10]
[ 5 11]
[ 6 12]]]Ciri khas np.stack terlihat dari kedua hasil di atas:
axis=1: baris-baris yang sejajar dariadanbditempatkan berdampingan, misalnyaaxis1[0, 0]berisi baris pertamaadanaxis1[0, 1]berisi baris pertamab.axis=2: elemen-elemen pada posisi yang sama dariadanbberdampingan menjadi pasangan, misalnyaaxis2[0, 0]berisi[1 7].- Apa pun nilai
axisyang dipilih, jumlah dimensi hasil selalu jumlah dimensi input ditambah satu; inilah pembeda utamanp.stackdarinp.concatenate.
vstack: Menempel Searah Baris #
np.vstack (vertical stack) menumpuk array menjadi baris-baris. Perilakunya paling terasa pada array satu dimensi: dua vektor berubah menjadi dua baris pada matriks dua dimensi, sesuatu yang tidak bisa dilakukan np.concatenate.
import numpy as np
pagi = np.array([27, 28, 30])
siang = np.array([32, 33, 34])
tabel = np.vstack([pagi, siang])
print(tabel)
print(tabel.shape)
print(np.concatenate([pagi, siang]).shape)
print(np.stack([pagi, siang]).shape)Output yang Dihasilkan:
[[27 28 30]
[32 33 34]]
(2, 3)
(6,)
(2, 3)Tiga cara penggabungan pada input yang sama memberi tiga bentuk berbeda:
np.vstack: vektor diangkat menjadi baris, hasilnya(2, 3).np.concatenate: penyambungan ujung ke ujung tanpa sumbu baru, hasilnya tetap satu dimensi(6,).np.stackdenganaxis=0: juga menghasilkan(2, 3); pada array satu dimensinp.vstackberperilaku sama seperti pemanggilan ini.
Untuk input dua dimensi, np.vstack setara penuh dengan np.concatenate([...], axis=0), sehingga fungsi ini dapat dibaca sebagai “concatenate versi baris yang juga menangani vektor”.
Kapan stack, Kapan concatenate #
| Kebutuhan | Fungsi yang cocok | Dimensi hasil |
|---|---|---|
| Memanjang pada dimensi yang sudah ada | np.concatenate | sama seperti input |
| Menambah satu sumbu baru | np.stack | dimensi input + 1 |
| Menjadikan vektor 1-D sebagai baris matriks | np.vstack | 1-D menjadi 2-D |
np.stack juga lebih ketat soal bentuk daripada np.concatenate. Karena setiap array harus mengisi satu irisan berukuran identik, semua input wajib berbentuk sama persis tanpa kecuali:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([1, 2])
try:
np.stack([a, b])
except ValueError as e:
print("ValueError:", e)Output yang Dihasilkan:
ValueError: all input arrays must have the same shape