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.

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.

python
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:

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

Mari kita uraikan mekanismenya:

  1. Baris 3-6 (np.array(...)): dua matriks berbentuk (2, 3) dibuat. Kesamaan bentuk ini wajib, sebab setiap array akan mengisi irisan yang berukuran sama.
  2. 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 pertama 2 berasal dari banyaknya array yang ditumpuk, bukan dari isi array.
  3. Baris 8-9 (print(tumpuk[...])): tumpuk[0] berisi a dan tumpuk[1] berisi b. 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).

python
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:

text
(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:

  1. axis=1: baris-baris yang sejajar dari a dan b ditempatkan berdampingan, misalnya axis1[0, 0] berisi baris pertama a dan axis1[0, 1] berisi baris pertama b.
  2. axis=2: elemen-elemen pada posisi yang sama dari a dan b berdampingan menjadi pasangan, misalnya axis2[0, 0] berisi [1 7].
  3. Apa pun nilai axis yang dipilih, jumlah dimensi hasil selalu jumlah dimensi input ditambah satu; inilah pembeda utama np.stack dari np.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.

python
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:

text
[[27 28 30]
 [32 33 34]]
(2, 3)
(6,)
(2, 3)

Tiga cara penggabungan pada input yang sama memberi tiga bentuk berbeda:

  1. np.vstack: vektor diangkat menjadi baris, hasilnya (2, 3).
  2. np.concatenate: penyambungan ujung ke ujung tanpa sumbu baru, hasilnya tetap satu dimensi (6,).
  3. np.stack dengan axis=0: juga menghasilkan (2, 3); pada array satu dimensi np.vstack berperilaku 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 #

KebutuhanFungsi yang cocokDimensi hasil
Memanjang pada dimensi yang sudah adanp.concatenatesama seperti input
Menambah satu sumbu barunp.stackdimensi input + 1
Menjadikan vektor 1-D sebagai baris matriksnp.vstack1-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:

python
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:

text
ValueError: all input arrays must have the same shape