Stacking

Menyusun array dengan vstack, hstack, concatenate, dan stack.

Daftar isi

Menyusun beberapa array menjadi satu array yang lebih besar dikenal sebagai stacking (penyusunan). Topik ini membahas empat fungsi NumPy untuk keperluan tersebut, yaitu np.concatenate yang menyambung pada sumbu yang sudah ada, np.vstack dan np.hstack sebagai bentuk singkatnya, serta np.stack yang membuat sumbu baru. Syarat kecocokan bentuk antar array yang disusun juga dibahas, termasuk pesan error yang muncul apabila syarat itu dilanggar.

concatenate pada sumbu yang ada#

Fungsi np.concatenate menyambung dua array atau lebih menjadi satu di sepanjang sebuah sumbu yang sudah ada. Parameter axis menentukan sumbunya, dengan nilai bawaan 0 yang berarti disambung ke bawah sepanjang baris. Dua array dua dimensi yang masing-masing berisi dua baris dan tiga kolom disambung menjadi empat baris pada contoh berikut.

python Contoh: concatenate pada axis 0 dan axis 1
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
print(np.concatenate([a, b]))
print(np.concatenate([a, b], axis=1))
text Keluaran
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]

Pemanggilan pertama menghasilkan array (4, 3) karena kedua array ditumpuk menjadi empat baris. Pemanggilan kedua dengan axis=1 menghasilkan (2, 6) karena penyambungan bergerak ke samping, sehingga kolom kedua array ditempel berdampingan. Jumlah sumbu array hasil selalu sama dengan jumlah sumbu masukannya, dan hanya panjang sumbu penyambungan yang bertambah.

Fungsi ini menerima urutan array apa pun, termasuk array satu dimensi yang disambung menjadi lebih panjang. Kelemahannya, np.concatenate tidak dapat menjadikan array satu dimensi sebagai baris atau kolom matriks, karena tidak ada sumbu baru yang tercipta. Keperluan itu ditangani np.vstack dan np.hstack.

vstack dan hstack#

Fungsi np.vstack menyusun array secara vertikal menjadi baris-baris baru, sedangkan np.hstack menyusunnya secara horizontal menjadi satu baris yang lebih panjang. Pada array satu dimensi, keduanya melakukan hal yang tidak dapat dilakukan np.concatenate tanpa bantuan, yaitu mengangkat array satu dimensi menjadi baris matriks atau menyambungnya sepanjang baris itu sendiri.

python Contoh: vstack dan hstack pada array satu dimensi
import numpy as np

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

Pemanggilan np.vstack([x, y]) menghasilkan matriks dua baris karena setiap array satu dimensi diperlakukan sebagai satu baris, sedangkan np.hstack([x, y]) menghasilkan array satu dimensi berisi enam elemen karena penyambungannya terjadi di sepanjang baris itu sendiri. Pada array dua dimensi, np.vstack setara dengan np.concatenate dengan axis=0, sedangkan np.hstack setara dengan axis=1. Pemilihan keduanya sering ditentukan oleh keterbacaan, karena nama vstack dan hstack langsung menyatakan arah penyusunannya.

stack dengan sumbu baru#

Fungsi np.stack menyusun array dengan menambahkan sumbu baru, sehingga jumlah dimensi hasilnya selalu satu lebih banyak daripada masukannya. Setiap array masukan menjadi satu irisan pada sumbu baru tersebut. Perilaku ini membuat np.stack tepat untuk mengelompokkan deretan data sejenis, misalnya dua pengukuran suhu yang sama panjangnya menjadi satu matriks. Penambahan sumbu inilah pembeda np.stack dari np.concatenate, yang menyambung array pada sumbu yang sudah ada tanpa mengubah jumlah dimensinya.

python Contoh: stack menambahkan sumbu baru
import numpy as np

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
s = np.stack([x, y])
print(s)
print(s.shape)
print(np.stack([x, y], axis=1).shape)
text Keluaran
[[1 2 3]
 [4 5 6]]
(2, 3)
(3, 2)

Bentuk hasilnya (2, 3) karena dua array masing-masing menjadi satu baris pada sumbu baru, sedangkan np.stack([x, y], axis=1) menempatkan irisannya sebagai kolom sehingga bentuknya (3, 2). Posisi sumbu baru dapat dipilih melalui axis, termasuk nilai negatif yang menghitung dari belakang. Karena setiap masukan menjadi satu irisan utuh, semua array yang disusun dengan np.stack wajib memiliki bentuk yang sama persis. Pilihan sumbu dengan demikian menentukan makna baris dan kolom pada data yang tersusun, sehingga orientasinya sebaiknya diputuskan dari cara data akan dibaca, bukan dari kebetulan bentuk.

Syarat kecocokan bentuk#

Penyambungan pada sumbu tertentu hanya mungkin apabila panjang semua sumbu lainnya sama pada setiap array yang disambung. Untuk np.concatenate dengan axis=0, jumlah kolom kedua array wajib sama, sedangkan jumlah barisnya bebas. Apabila syarat ini dilanggar, NumPy menolak operasinya dengan ValueError.

python Contoh: error bentuk tidak cocok pada concatenate
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[1, 2], [3, 4]])
try:
    np.concatenate([a, b])
except ValueError as e:
    print(f"{type(e).__name__}: {e}")
text Keluaran
ValueError: all the input array dimensions except for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 3 and the array at index 1 has size 2

Pesan error menyatakan secara harfiah bahwa seluruh dimensi selain sumbu penyambungan wajib cocok, dan pada dimensi 1 array pertama berukuran 3 sedangkan array kedua berukuran 2. Dua array contoh ini memang tidak dapat disambung pada axis=0 karena kolomnya berbeda, tetapi masih dapat disambung pada axis=1 karena jumlah barisnya sama. Membaca pesan error dari arah sumbu penyambungan adalah cara tercepat menemukan perbaikannya.

Kesalahan umum#

Kesalahan yang lazim adalah menggunakan np.stack pada array yang bentuknya hanya mirip, bukan sama. Karena setiap masukan menjadi satu irisan pada sumbu baru, selisih satu elemen saja sudah menggagalkan penyusunan.

python Contoh: error bentuk tidak sama pada stack
import numpy as np

x = np.array([1, 2, 3])
z = np.array([1, 2])
try:
    np.stack([x, z])
except ValueError as e:
    print(f"{type(e).__name__}: {e}")
text Keluaran
ValueError: all input arrays must have the same shape

Pesan all input arrays must have the same shape lebih tegas daripada pesan np.concatenate karena tidak ada sumbu yang dikecualikan. Apabila maksudnya hanya menyambung panjang, gunakan np.concatenate atau np.hstack, sedangkan np.stack digunakan ketika kedudukan setiap array sebagai irisan memang dimaksudkan. Membedakan kedua maksud ini sejak awal mencegah error bentuk yang berulang.

Kesalahan kedua adalah mencampur array dengan jumlah dimensi berbeda dalam satu penyambungan. Array dua dimensi dan array satu dimensi tidak dapat disambung meskipun panjang salah satu sumbunya cocok, karena NumPy tidak menebak dimensi mana yang sejajar.

python Contoh: error jumlah dimensi berbeda pada concatenate
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
x = np.array([1, 2, 3])
try:
    np.concatenate([a, x])
except ValueError as e:
    print(f"{type(e).__name__}: {e}")
text Keluaran
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)

Pesan error menyatakan bahwa jumlah dimensi kedua array berbeda, yaitu 2 dan 1, sehingga penyelarasan tidak pernah terjadi. Perbaikannya adalah menyamakan dimensi terlebih dahulu, misalnya mengangkat array satu dimensi menjadi baris melalui np.vstack, atau mengubah bentuknya dengan reshape sebelum disambung.

Ringkasan#

  • np.concatenate menyambung array pada sumbu yang sudah ada, dengan axis=0 sebagai nilai bawaan dan axis=1 untuk penyambungan mendatar.
  • np.vstack dan np.hstack menyatakan arah penyusunan secara eksplisit, dan pada array satu dimensi keduanya mengangkat masukan menjadi baris atau menyambungnya sepanjang baris.
  • np.stack menambahkan satu sumbu baru, sehingga jumlah dimensi hasilnya selalu satu lebih banyak daripada masukannya.
  • np.concatenate menuntut kecocokan pada semua sumbu selain sumbu penyambungan, sedangkan np.stack menuntut bentuk yang sama persis.

Referensi#