Setelah mengenal penggabungan searah baris, kita beralih ke dua arah lain. np.hstack (horizontal stack) menyambung array menyamping searah kolom, sedangkan np.dstack (depth stack) menumpuk array ke arah kedalaman, yaitu sumbu ketiga. Keduanya adalah pintasan untuk pola penggabungan yang sering dipakai: pada array dua dimensi, np.hstack setara dengan np.concatenate dengan axis=1.

Bab ini menelusuri perilaku np.hstack pada array dua dimensi, perbedaan pentingnya pada array satu dimensi, fungsi np.dstack, serta analogi nyata dstack pada susunan channel warna gambar.

hstack: Menggabungkan Searah Kolom #

np.hstack menempelkan array-input berdampingan sehingga kolom-kolom dari array kedua melanjutkan kolom array pertama. Contoh berikut memakai dua matriks penjualan berbentuk (2, 3).

python
import numpy as np

m = np.array([[1, 2, 3],
              [4, 5, 6]])
n = np.array([[7, 8, 9],
              [10, 11, 12]])
gabung = np.hstack([m, n])
print(gabung)
print(gabung.shape)

Output yang Dihasilkan:

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

Mari kita baca mekanismenya:

  1. Baris 3-6 (np.array(...)): dua matriks (2, 3) dibuat. Jumlah baris keduanya sama, dan kesamaan inilah syarat wajib penggabungan menyamping.
  2. Baris 7 (np.hstack([m, n])): kolom n ditempel di sebelah kanan kolom m; bentuk berubah dari (2, 3) menjadi (2, 6) dengan jumlah baris tetap.
  3. Baris 8-9 (print(...)): hasil berupa array baru; pada array dua dimensi pemanggilan ini memberikan hasil yang identik dengan np.concatenate([m, n], axis=1).

Perilaku Berbeda pada Array Satu Dimensi #

Pada array satu dimensi, np.hstack dan np.vstack memunculkan perbedaan yang sering mengejutkan. np.hstack menyambung vektor ujung ke ujung sehingga hasilnya tetap satu dimensi, sementara np.vstack menjadikan setiap vektor satu baris matriks dua dimensi.

python
import numpy as np

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print(np.hstack([x, y]))
print(np.hstack([x, y]).shape)
print(np.vstack([x, y]))
print(np.vstack([x, y]).shape)

Output yang Dihasilkan:

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

dstack: Menumpuk Searah Kedalaman #

np.dstack menempatkan array-input sebagai irisan pada sumbu ketiga hasil. Dua matriks (2, 3) yang ditumpuk searah kedalaman menghasilkan array (2, 3, 2): setiap sel matriks kini menyimpan sepasang nilai, satu dari m dan satu dari n.

python
import numpy as np

m = np.array([[1, 2, 3],
              [4, 5, 6]])
n = np.array([[7, 8, 9],
              [10, 11, 12]])
dalam = np.dstack([m, n])
print(dalam.shape)
print(dalam)
print(dalam[0, 1])

Output yang Dihasilkan:

text
(2, 3, 2)
[[[ 1  7]
  [ 2  8]
  [ 3  9]]

 [[ 4 10]
  [ 5 11]
  [ 6 12]]]
[2 8]

Cara membaca hasilnya:

  1. Bentuk (2, 3, 2): dua dimensi pertama menyalin bentuk input, sedangkan dimensi ketiga berukuran 2 karena ada dua array yang ditumpuk.
  2. dalam[i, j]: berisi pasangan [m[i, j], n[i, j]]; pada contoh, dalam[0, 1] menghasilkan [2 8] karena m[0, 1] bernilai 2 dan n[0, 1] bernilai 8.
  3. d pada np.dstack: setiap array diperlakukan sebagai satu “lapisan” dan lapisan-lapisan itu disusun di belakang satu sama lain.

Analogi Channel Warna RGB #

Susunan kedalaman punya contoh nyata di pengolahan gambar. Citra berwarna umumnya disimpan sebagai array berukuran (tinggi, lebar, kanal); kanal merah, hijau, dan biru masing-masing berupa matriks kecerahan. np.dstack mengubah tiga matriks kanal menjadi satu array citra.

python
import numpy as np

merah = np.array([[200, 150],
                  [ 90,  30]])
hijau = np.array([[220, 160],
                  [ 95,  35]])
biru = np.array([[210, 155],
                  [ 92,  32]])
rgb = np.dstack([merah, hijau, biru])
print(rgb.shape)
print(rgb[0, 0])
print(rgb[:, :, 0])

Output yang Dihasilkan:

text
(2, 2, 3)
[200 220 210]
[[200 150]
 [ 90  30]]

Yang terjadi pada baris-baris di atas:

  1. Baris 3-8 (np.array(...)): tiga matriks kanal berukuran 2 x 2 dibuat, mewakili citra kecil dengan empat piksel.
  2. Baris 9 (np.dstack([...])): ketiga kanal disusun ke kedalaman sehingga bentuknya (2, 2, 3).
  3. rgb[0, 0]: tiga nilai kanal milik satu piksel pada pojok kiri atas, yaitu [200 220 210].
  4. rgb[:, :, 0]: potongan sumbu kanal ke-0 mengembalikan matriks kanal merah persis seperti input awal.

Tabel berikut merangkum arah kerja ketiga pintasan yang sudah kita bahas:

FungsiArah penggabunganPadanan pada input 2-D
np.vstackke bawah, baris bertambahnp.concatenate([...], axis=0)
np.hstackmenyamping, kolom bertambahnp.concatenate([...], axis=1)
np.dstackke kedalaman, sumbu ke-3np.stack([...], axis=2)