Reshape & Transpose
Pada materi sebelumnya kita telah mempelajari operasi aritmatika, broadcasting, aggregation, variance, standard deviation, dan visualisasi data menggunakan NumPy.
Dalam praktik Data Science dan Machine Learning, kita akan sering menemukan data dengan bentuk atau shape yang berbeda.
Sebuah algoritma atau operasi tertentu mungkin membutuhkan data dengan bentuk tertentu. Jika shape tidak sesuai, operasi dapat menghasilkan error atau menghasilkan bentuk output yang tidak kita inginkan.
NumPy menyediakan beberapa fitur penting untuk mengatur bentuk array, di antaranya:
reshape()- Transpose dengan
.T np.transpose()
Pada materi ini kita akan memahami bagaimana mengubah dan menukar dimensi array dengan benar.
Mengapa Shape Penting?
Setiap NumPy array memiliki sebuah shape yang menunjukkan ukuran array pada setiap dimensinya.
Contohnya:
import numpy as np
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
print(A.shape)
Output:
(2, 3)
Artinya:
- Memiliki 2 baris.
- Memiliki 3 kolom.
- Total terdapat 6 elemen.
Shape:
(2, 3)
berbeda dengan:
(3, 2)
Walaupun keduanya sama-sama memiliki 6 elemen.
Mengapa Shape Penting dalam Machine Learning?
Banyak operasi numerik dan algoritma Machine Learning memiliki persyaratan tertentu terhadap bentuk data.
Misalnya sebuah model dapat mengharapkan input berbentuk:
(samples, features)
Jika data memiliki shape yang berbeda, kita mungkin perlu menyesuaikannya terlebih dahulu.
Shape juga sangat penting ketika:
- Melakukan operasi matematika.
- Menggunakan broadcasting.
- Memproses dataset.
- Mengubah format input model.
- Melakukan operasi matriks.
- Mengolah data multidimensi.
Karena itu, .shape merupakan salah satu atribut yang sebaiknya selalu diperhatikan ketika bekerja dengan NumPy.
Mengubah Shape dengan reshape()
Fungsi reshape() digunakan untuk mengubah bentuk array tanpa mengubah nilai elemen yang terdapat di dalamnya.
Contohnya:
A = np.array([1, 2, 3, 4, 5, 6])
print(A.shape)
Output:
(6,)
Array tersebut dapat diubah menjadi bentuk (2, 3):
A_reshaped = A.reshape(2, 3)
print(A_reshaped)
print(A_reshaped.shape)
Output:
[[1 2 3]
[4 5 6]]
(2, 3)
Nilai datanya tetap sama:
1, 2, 3, 4, 5, 6
Yang berubah adalah bentuk array.
Syarat Menggunakan reshape()
Jumlah total elemen sebelum dan sesudah reshape() harus sama.
Misalnya:
6 elemen
dapat diubah menjadi:
(2, 3)
karena:
2 × 3 = 6
Kita juga dapat mengubahnya menjadi:
(3, 2)
karena:
3 × 2 = 6
Atau:
(1, 6)
karena:
1 × 6 = 6
Namun tidak dapat menjadi:
(4, 2)
karena:
4 × 2 = 8
sedangkan array hanya memiliki 6 elemen.
Contoh reshape()
A = np.array([1, 2, 3, 4, 5, 6])
A1 = A.reshape(2, 3)
A2 = A.reshape(3, 2)
A3 = A.reshape(1, 6)
print(A1)
print(A2)
print(A3)
Ketiga hasil tersebut memiliki bentuk yang berbeda, tetapi seluruhnya menggunakan enam elemen yang sama.
reshape() dan Broadcasting
Salah satu penggunaan reshape() yang penting adalah membantu menyesuaikan shape array agar memenuhi aturan broadcasting.
Misalnya:
A2 = np.random.randint(
10,
size=(2, 3)
)
A3 = np.random.randint(
10,
size=(2, 3, 3)
)
Periksa shape:
print(A2.shape)
print(A3.shape)
Output:
(2, 3)
(2, 3, 3)
Jika kita mencoba:
A2 * A3
operasi tersebut tidak kompatibel secara langsung.
NumPy akan menghasilkan error broadcasting karena dimensi yang dibandingkan dari belakang tidak sesuai.
Menyesuaikan Shape dengan reshape()
Kita dapat mengubah A2 menjadi:
A2_reshaped = A2.reshape(2, 3, 1)
print(A2_reshaped.shape)
Output:
(2, 3, 1)
Sekarang kita memiliki:
A2_reshaped → (2, 3, 1)
A3 → (2, 3, 3)
Pada dimensi terakhir:
1
3
kedua dimensi tersebut kompatibel karena salah satunya bernilai 1.
Maka:
result = A2_reshaped * A3
dapat dilakukan menggunakan broadcasting.
Memahami reshape dan Broadcasting
Perhatikan perubahan berikut:
Sebelum:
A2 → (2, 3)
A3 → (2, 3, 3)
↓
Tidak kompatibel
Kemudian:
A2.reshape(2, 3, 1)
↓
A2 → (2, 3, 1)
A3 → (2, 3, 3)
↓
Broadcasting
↓
Berhasil
Perlu dipahami bahwa reshape() tidak secara otomatis membuat semua operasi menjadi valid.
Shape yang baru tetap harus memenuhi aturan operasi yang ingin dilakukan.
Menggunakan -1 pada reshape()
NumPy memungkinkan kita menggunakan -1 pada reshape() agar NumPy menghitung ukuran dimensi tersebut secara otomatis.
Contohnya:
A = np.array([1, 2, 3, 4, 5, 6])
A_reshaped = A.reshape(2, -1)
print(A_reshaped)
NumPy mengetahui bahwa total elemen adalah 6.
Karena dimensi pertama adalah 2, maka dimensi kedua harus:
6 ÷ 2 = 3
Sehingga hasilnya:
[[1 2 3]
[4 5 6]]
Shape:
(2, 3)
Contoh lain:
A.reshape(-1, 2)
akan menghasilkan shape:
(3, 2)
Catatan
Dalam satu operasi reshape(), hanya satu dimensi yang sebaiknya menggunakan -1 agar ukuran yang harus dihitung dapat ditentukan secara unik.
Transpose
Selain reshape(), NumPy menyediakan operasi transpose.
Transpose digunakan untuk menukar urutan dimensi atau sumbu array.
Untuk array dua dimensi, transpose secara sederhana dapat dipahami sebagai:
Baris ↔ Kolom
Contohnya:
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
Shape awal:
(2, 3)
Menggunakan .T
Cara sederhana untuk melakukan transpose adalah menggunakan .T.
A_transposed = A.T
print(A_transposed)
print(A_transposed.shape)
Output:
[[1 4]
[2 5]
[3 6]]
(3, 2)
Perhatikan:
Sebelum:
(2, 3)
Sesudah transpose:
(3, 2)
Baris menjadi kolom dan kolom menjadi baris.
Cara Memahami Transpose
Array awal:
1 2 3
4 5 6
Setelah transpose:
1 4
2 5
3 6
Dengan kata lain:
Baris pertama → Kolom pertama
Baris kedua → Kolom kedua
Transpose tidak mengubah nilai elemen, tetapi mengubah bagaimana elemen tersebut tersusun berdasarkan dimensinya.
np.transpose()
Selain .T, NumPy menyediakan fungsi:
np.transpose()
Contohnya:
A_transposed = np.transpose(A)
print(A_transposed)
Hasilnya sama dengan:
A.T
Untuk array dua dimensi, kedua pendekatan tersebut dapat digunakan.
A.T
lebih singkat, sedangkan:
np.transpose(A)
lebih eksplisit sebagai fungsi NumPy.
Perbedaan reshape dan transpose
Walaupun keduanya dapat mengubah shape, reshape() dan transpose memiliki tujuan yang berbeda.
reshape()
reshape() digunakan untuk mengatur ulang bentuk array dengan jumlah elemen yang tetap sama.
Contoh:
A = np.array([1, 2, 3, 4, 5, 6])
A.reshape(2, 3)
dapat menghasilkan:
[[1 2 3]
[4 5 6]]
Transpose
Transpose digunakan untuk menukar urutan dimensi atau axis.
Contoh:
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
A.T
menghasilkan:
[[1 4]
[2 5]
[3 6]]
Tabel Perbandingan
| Fitur | reshape() | .T / np.transpose() |
|---|---|---|
| Tujuan | Mengubah shape | Menukar urutan axis |
| Jumlah elemen | Tetap sama | Tetap sama |
| Bentuk baru | Dapat ditentukan | Ditentukan dari transpose |
| Array 2D | Bisa menjadi banyak bentuk | Baris ↔ kolom |
| Cocok untuk | Menyesuaikan struktur | Menukar orientasi dimensi |
Contoh sederhana:
reshape:
(6,)
↓
(2, 3)
Sedangkan:
transpose:
(2, 3)
↓
(3, 2)
reshape Tidak Sama dengan Transpose
Perhatikan contoh berikut:
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
Jika menggunakan:
A.reshape(3, 2)
hasilnya:
[[1 2]
[3 4]
[5 6]]
Sedangkan:
A.T
menghasilkan:
[[1 4]
[2 5]
[3 6]]
Keduanya sama-sama menghasilkan shape:
(3, 2)
tetapi susunan datanya berbeda.
Ini merupakan perbedaan yang sangat penting.
Shape yang sama tidak selalu berarti susunan data yang sama.
Reshape pada Array Multidimensi
reshape() juga dapat digunakan pada array dengan lebih dari dua dimensi.
Contohnya:
A = np.arange(24)
print(A.shape)
Output:
(24,)
Array tersebut dapat diubah menjadi:
A_3d = A.reshape(2, 3, 4)
print(A_3d.shape)
Output:
(2, 3, 4)
Jumlah elemennya tetap:
2 × 3 × 4 = 24
Transpose pada Array Multidimensi
Pada array multidimensi, transpose tidak hanya berarti "baris menjadi kolom".
Transpose bekerja dengan menukar urutan axis.
Contohnya:
A = np.zeros((2, 3, 4))
print(A.shape)
Output:
(2, 3, 4)
Jika menggunakan:
A.T
shape menjadi:
(4, 3, 2)
Urutan axis dibalik:
(2, 3, 4)
↓
(4, 3, 2)
Hal ini penting ketika bekerja dengan data multidimensi seperti:
- Gambar.
- Video.
- Tensor.
- Data scientific computing.
- Input neural network.
Menentukan Urutan Axis dengan np.transpose()
Untuk kontrol yang lebih spesifik, np.transpose() dapat menerima urutan axis.
Contohnya:
A = np.zeros((2, 3, 4))
B = np.transpose(A, (1, 0, 2))
print(B.shape)
Hasil:
(3, 2, 4)
Artinya urutan axis:
(0, 1, 2)
diubah menjadi:
(1, 0, 2)
Konsep ini akan semakin penting ketika mulai bekerja dengan data yang memiliki tiga dimensi atau lebih.
Memeriksa Shape Setelah Transformasi
Setiap kali melakukan reshape() atau transpose, biasakan memeriksa hasilnya.
A = np.zeros((2, 3))
print("Original:", A.shape)
B = A.reshape(3, 2)
print("Reshaped:", B.shape)
C = A.T
print("Transposed:", C.shape)
Dengan cara tersebut kita dapat memastikan bahwa bentuk array sesuai dengan yang diharapkan.
Reshape dan Machine Learning
Dalam Machine Learning, shape data sangat penting karena model biasanya mengharapkan format input tertentu.
Misalnya:
(samples, features)
Jika terdapat:
100 samples
5 features
maka bentuk data dapat berupa:
(100, 5)
Jika data memiliki bentuk berbeda, kita mungkin perlu melakukan transformasi terlebih dahulu.
Namun, transformasi harus dilakukan berdasarkan makna data, bukan hanya untuk membuat error hilang.
Jangan melakukan:
reshape()
secara sembarangan hanya karena sebuah operasi menghasilkan error.
Kita harus memahami:
- Apa arti setiap dimensi.
- Berapa jumlah sample.
- Berapa jumlah feature.
- Bentuk input yang dibutuhkan.
- Operasi apa yang sedang dilakukan.
Debugging Shape
Ketika menemukan error yang berhubungan dengan shape, gunakan workflow berikut:
Error
↓
Periksa shape
↓
print(array.shape)
↓
Periksa ndim
↓
Pahami arti setiap dimensi
↓
Periksa aturan broadcasting
↓
Tentukan apakah perlu reshape
↓
Tentukan apakah perlu transpose
↓
Jalankan kembali operasi
Contohnya:
print(A.shape)
print(B.shape)
Jika masih belum jelas:
print(A.ndim)
print(B.ndim)
Kebiasaan sederhana ini dapat membantu menemukan banyak masalah saat bekerja dengan NumPy.
Kesalahan yang Sering Terjadi
Menganggap reshape Mengubah Data
reshape() mengubah bentuk array, bukan nilai datanya.
Namun, susunan elemen pada hasil reshape() dapat terlihat berbeda karena cara elemen disusun dalam bentuk baru.
Menganggap reshape dan transpose Sama
Keduanya dapat menghasilkan shape yang berbeda dari bentuk awal, tetapi cara kerjanya berbeda.
reshape() mengatur bentuk baru berdasarkan jumlah elemen.
Transpose menukar urutan axis.
Hanya Melihat Shape
Dua array dapat memiliki shape yang sama tetapi susunan nilai yang berbeda.
Contoh:
A.reshape(3, 2)
dan:
A.T
dapat menghasilkan shape yang sama tetapi isi yang tersusun berbeda.
Karena itu, periksa juga isi array jika sedang melakukan debugging.
Menggunakan reshape untuk Semua Error
Tidak semua error shape diselesaikan dengan reshape().
Terkadang yang dibutuhkan adalah:
- Transpose.
- Memperbaiki cara indexing.
- Mengubah struktur data.
- Menyesuaikan operasi.
- Memastikan data memang memiliki bentuk yang benar.
Ringkasan
Pada materi ini kita telah mempelajari:
- Shape menunjukkan ukuran array pada setiap dimensi.
reshape()digunakan untuk mengubah bentuk array.- Jumlah total elemen harus tetap sama setelah
reshape(). -1dapat digunakan agar NumPy menghitung salah satu dimensi secara otomatis.reshape()dapat digunakan untuk membantu menyesuaikan shape dalam broadcasting.- Transpose digunakan untuk menukar urutan axis.
.Tmerupakan cara sederhana melakukan transpose.np.transpose()menyediakan fungsi transpose dengan kontrol yang lebih fleksibel.- Pada array 2D, transpose dapat dipahami sebagai pertukaran baris dan kolom.
- Pada array multidimensi, transpose bekerja dengan menukar urutan axis.
reshape()dan transpose memiliki tujuan yang berbeda.- Dua array dengan shape yang sama belum tentu memiliki susunan data yang sama.
.shapedan.ndimmerupakan alat penting untuk debugging array.- Shape sangat penting dalam Data Science dan Machine Learning.
Checklist Pembelajaran
Pastikan Anda sudah memahami:
- Apa yang dimaksud dengan shape.
- Mengapa shape penting dalam NumPy.
- Cara menggunakan
reshape(). - Syarat jumlah elemen pada
reshape(). - Cara menggunakan
-1padareshape(). - Hubungan
reshape()dengan broadcasting. - Apa yang dimaksud dengan transpose.
- Cara menggunakan
.T. - Cara menggunakan
np.transpose(). - Perbedaan
reshape()dan transpose. - Perbedaan transpose pada array 2D dan multidimensi.
- Cara menentukan urutan axis menggunakan
np.transpose(). - Cara menggunakan
.shapeuntuk debugging. - Mengapa tidak semua error shape dapat diselesaikan dengan
reshape().
Latihan
Gunakan array berikut:
A = np.arange(24)
print(A)
print(A.shape)
Kemudian lakukan latihan berikut:
- Ubah
Amenjadi array dengan shape(2, 12). - Ubah
Amenjadi shape(3, 8). - Ubah
Amenjadi shape(4, 6). - Gunakan
-1untuk menghasilkan shape(6, 4). - Ubah
Amenjadi array tiga dimensi dengan shape(2, 3, 4). - Gunakan
.Tpada array tiga dimensi tersebut. - Periksa shape sebelum dan sesudah transpose.
- Buat array 2D dengan shape
(3, 4). - Bandingkan hasil
reshape(4, 3)dengan.T. - Perhatikan mengapa keduanya dapat memiliki shape yang sama tetapi susunan data berbeda.
- Buat contoh broadcasting yang menghasilkan error.
- Gunakan
reshape()untuk membuat shape yang kompatibel dan coba kembali operasi tersebut.
Tujuan latihan ini bukan hanya membuat kode berjalan, tetapi memahami bagaimana shape memengaruhi cara NumPy memperlakukan data.