Ada dua macam penggeseran data dalam array. Pergeseran biasa menggantikan posisi yang terdorong dengan nilai baru, sedangkan pergeseran sirkular membawa elemen ujung kembali masuk di sisi lain. NumPy menyediakan np.roll untuk pergeseran sirkular dan np.rot90 untuk rotasi seperempat lingkaran. Keduanya sering dipakai untuk pola berulang: jadwal piket yang bergilir, label hari yang diputar, atau papan data yang perlu dilihat dari arah lain.
Cakupan bab ini:
np.rollpada array satu dimensi dan peranaxispada array dua dimensi.np.rot90dengan argumenkdanaxes.- Catatan singkat membedakan
np.resizedarireshape.
np.roll: Pergeseran Sirkular Satu Dimensi #
Sebagai kasus, lima petugas piket perlu digeser satu posisi tiap hari agar tidak ada yang selalu mendapat shift pagi. np.roll(a, shift) menggeser seluruh elemen sejauh shift; elemen yang terdorong keluar dari ujung kembali masuk di sisi lain — sifat inilah yang membedakannya dari slicing biasa.
import numpy as np
petugas = np.array(["Andi", "Budi", "Citra", "Dewi", "Eka"])
print(np.roll(petugas, 1))
print(np.roll(petugas, -1))
print(np.roll(petugas, 3))Output yang Dihasilkan:
['Eka' 'Andi' 'Budi' 'Citra' 'Dewi']
['Budi' 'Citra' 'Dewi' 'Eka' 'Andi']
['Citra' 'Dewi' 'Eka' 'Andi' 'Budi']Mari kita bedah:
- Baris 4:
shift=1menggeser semua elemen satu posisi ke kanan; Eka yang semula terakhir kembali ke posisi pertama. Inilah susunan petugas untuk hari berikutnya. - Baris 5: shift negatif menggeser ke kiri; Andi pindah ke posisi ujung.
- Baris 6:
shift=3memberi hasil yang sama denganshift=-2pada lima elemen, karena pergeseran dihitung modulo panjang array.
Karena sifatnya melingkar, setelah lima kali pergeseran susunan kembali seperti semula — persis perilaku yang diharapkan dari rotasi jadwal.
Axis pada roll Dua Dimensi #
Tanpa axis, np.roll meratakan array menjadi satu barisan, menggesernya, lalu menata ulang sesuai bentuk asli. Perilaku ini jarang menjadi yang dimaksudkan. Argumen axis membatasi pergeseran pada satu sumbu saja.
import numpy as np
jadwal = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.roll(jadwal, 1))
print(np.roll(jadwal, 1, axis=0))
print(np.roll(jadwal, 1, axis=1))Output yang Dihasilkan:
[[6 1 2]
[3 4 5]]
[[4 5 6]
[1 2 3]]
[[3 1 2]
[6 4 5]]- Baris 5: tanpa axis, enam elemen diratakan lalu digeser; nilai 6 di kanan bawah pindah ke kiri atas dan sisanya mengalir melewati batas baris — hasil yang sering mengejutkan.
- Baris 6:
axis=0menggeser antar baris; baris terakhir (4, 5, 6) naik menjadi baris pertama. - Baris 7:
axis=1menggeser di dalam tiap baris; kolom terakhir kembali ke kolom pertama.
np.rot90: Rotasi 90 Derajat #
np.rot90(m, k=1, axes=(0, 1)) memutar array 90 derajat berlawanan arah jarum jam (counterclockwise) pada bidang dua axis yang dipilih. Argumen k menentukan banyaknya putaran seperempat, dan axes memilih bidang putar untuk array lebih dari dua dimensi. Rotasi berbeda dari reshape: bukan hanya bentuk yang berubah (matriks 2x3 menjadi 3x2), tetapi posisi elemen juga mengikuti arah putar.
import numpy as np
papan = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.rot90(papan))
print(np.rot90(papan, k=2))
print(np.rot90(papan, axes=(1, 0)))Output yang Dihasilkan:
[[3 6]
[2 5]
[1 4]]
[[6 5 4]
[3 2 1]]
[[4 1]
[5 2]
[6 3]]- Baris 5: rotasi CCW; angka 3 yang semula di kanan atas kini di kiri atas, dan bentuk berubah menjadi 3x2. Hasilnya setara dengan transpose lalu pembalikan urutan baris — konsep transpose dibahas tuntas pada Chapter transpose.
- Baris 6:
k=2berarti 180 derajat; urutan elemen terbalik penuh dibanding array asli. - Baris 7:
axes=(1, 0)menukar arah putar menjadi searah jarum jam.
Satu perbedaan memori yang perlu diingat: np.rot90 mengembalikan view dari data asli, sedangkan np.roll menyalin data ke array baru. Mengubah nilai pada hasil rot90 pun mengubah papan.
Catatan Singkat: np.resize vs reshape #
reshape hanya menata ulang elemen: jumlah elemen harus tetap, jika tidak ValueError muncul. np.resize mengembalikan array seukuran permintaan; bila target lebih besar, data lama diulang dari awal untuk mengisi kekurangan; bila lebih kecil, data dipotong. Catatan serupa tersedia pada Chapter Memeriksa Kompatibilitas Bentuk; di sini kita lihat versinya dengan data label hari.
import numpy as np
hari = np.array(["Senin", "Selasa", "Rabu"])
print(np.resize(hari, 5))
try:
print(hari.reshape(5))
except ValueError as e:
print("ValueError:", e)Output yang Dihasilkan:
['Senin' 'Selasa' 'Rabu' 'Senin' 'Selasa']
ValueError: cannot reshape array of size 3 into shape (5,)- Baris 4: lima slot diisi dengan mengulang dari awal — Senin dan Selasa muncul dua kali.
- Baris 6-8:
reshapemenolak permintaan itu karena tiga elemen tidak mungkin menjadi lima tanpa menambah data.
Kombinasi roll, rot90, dan pasangan resize/reshape melengkapi kotak alat manipulasi bentuk: geser, putar, lalu sesuaikan ukuran — masing-masing dengan aturan memori yang sudah kita ketahui.