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.roll pada array satu dimensi dan peran axis pada array dua dimensi.
  • np.rot90 dengan argumen k dan axes.
  • Catatan singkat membedakan np.resize dari reshape.

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.

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

text
['Eka' 'Andi' 'Budi' 'Citra' 'Dewi']
['Budi' 'Citra' 'Dewi' 'Eka' 'Andi']
['Citra' 'Dewi' 'Eka' 'Andi' 'Budi']

Mari kita bedah:

  1. Baris 4: shift=1 menggeser semua elemen satu posisi ke kanan; Eka yang semula terakhir kembali ke posisi pertama. Inilah susunan petugas untuk hari berikutnya.
  2. Baris 5: shift negatif menggeser ke kiri; Andi pindah ke posisi ujung.
  3. Baris 6: shift=3 memberi hasil yang sama dengan shift=-2 pada 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.

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

text
[[6 1 2]
 [3 4 5]]
[[4 5 6]
 [1 2 3]]
[[3 1 2]
 [6 4 5]]
  1. 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.
  2. Baris 6: axis=0 menggeser antar baris; baris terakhir (4, 5, 6) naik menjadi baris pertama.
  3. Baris 7: axis=1 menggeser 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.

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

text
[[3 6]
 [2 5]
 [1 4]]
[[6 5 4]
 [3 2 1]]
[[4 1]
 [5 2]
 [6 3]]
  1. 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.
  2. Baris 6: k=2 berarti 180 derajat; urutan elemen terbalik penuh dibanding array asli.
  3. 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.

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

text
['Senin' 'Selasa' 'Rabu' 'Senin' 'Selasa']
ValueError: cannot reshape array of size 3 into shape (5,)
  1. Baris 4: lima slot diisi dengan mengulang dari awal — Senin dan Selasa muncul dua kali.
  2. Baris 6-8: reshape menolak 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.