Kalau shape menjelaskan bentuk array, maka strides menjelaskan cara berjalan di atas datanya. Atribut ini menyatakan berapa byte yang harus dilangcati untuk maju satu langkah pada tiap axis — dan hampir semua trik NumPy yang tampak tanpa salinan (transpose, broadcasting, jendela geser) bekerja hanya dengan memanipulasi angka ini.
Bab ini membaca strides untuk array biasa, membuktikan bagaimana broadcasting memakai stride 0, memperkenalkan as_strided beserta risikonya, lalu menutup dengan hubungan dtype dan stride.
Membaca a.strides #
Untuk array 3x4 bertipe int64, maju satu kolom berarti melangcati 8 byte (ukuran satu elemen), sedangkan maju satu baris berarti melangcati empat elemen sekaligus:
import numpy as np
a = np.arange(12, dtype=np.int64).reshape(3, 4)
print("shape :", a.shape)
print("strides :", a.strides)
print("strides T:", a.T.strides)Output yang Dihasilkan:
shape : (3, 4)
strides : (32, 8)
strides T: (8, 32)Bedah baris demi baris:
- Baris 3 (
a = ...): array 3x4 dibentuk dari dua belas elemenint64yang berdempetan di memori. - Baris 5 (
a.strides): tuple(32, 8)dibaca per axis: maju satu baris (axis 0) melangcati 32 byte atau empat elemen; maju satu kolom (axis 1) melangcati 8 byte atau satu elemen. - Baris 6 (
a.T.strides): transpose tidak memindahkan data sama sekali — ia hanya menukar isi tuple strides menjadi(8, 32)sehingga pembacaan kolom kini berperilaku seperti pembacaan baris.
Dari strides kita bisa menghitung alamat elemen mana pun: alamat elemen [i, j] sama dengan alamat awal ditambah i * 32 + j * 8 byte. Rumus inilah yang dipakai interpreter setiap kali mengakses elemen.
stride 0: Broadcasting tanpa Menyalin #
Broadcasting versi lanjutan bisa dibuat eksplisit dengan np.broadcast_to. Perhatikan strides hasilnya: satu angkanya nol.
import numpy as np
baris = np.arange(4)
m = np.broadcast_to(baris, (3, 4))
print("strides baris:", baris.strides)
print("strides m :", m.strides)
print("nbytes m :", m.nbytes)
print(m)Output yang Dihasilkan:
strides baris: (8,)
strides m : (0, 8)
nbytes m : 96
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]Cara membacanya:
- Baris 4 (
np.broadcast_to): array satu baris “diregangkan” menjadi matriks 3x4 tanpa menyalin satu byte pun. - Baris 6 (
strides m): stride 0 pada axis 0 berarti maju satu baris tidak berpindah byte — ketiga baris membaca data yang sama berulang kali. - Baris 7 (
nbytes m):nbytesmelaporkan ukuran logis 96 byte, padahal data fisiknya hanya 32 byte; nilai tersebut menggambarkan ukuran bila array disalin, bukan memori yang dipakai.
as_strided: Jendela Geser dari View #
np.lib.stride_tricks.as_strided membiarkan kita menetapkan shape dan strides bebas. Trik klasiknya adalah sliding window: melihat deret sebagai tumpukan jendela yang saling tumpang-tindih, tanpa menyalin apa pun.
import numpy as np
from numpy.lib.stride_tricks import as_strided
x = np.arange(6)
jendela = as_strided(x, shape=(4, 3), strides=(8, 8), writeable=False)
print(jendela)Output yang Dihasilkan:
[[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]]Cara membacanya:
- Baris 5 (
as_strided):shape=(4, 3)menyuruh NumPy membaca empat baris berisi tiga elemen;strides=(8, 8)menyatakan maju satu baris maupun satu kolom sama-sama melangcati satu elemen — baris berikutnya dimulai satu elemen setelah baris sebelumnya. writeable=False: hasilnya hanya untuk dibaca; ini kunci penggunaan yang aman.- Output: baris
1 2 3dan seterusnya membaca ulang elemen yang sudah dilihat baris di atasnya — empat jendela lahir dari enam elemen data.
dtype Mengubah Strides #
Karena stride dihitung dalam byte, mengganti dtype otomatis mengubah semua nilai strides — bukti bahwa strides dan itemsize berjalan berpasangan:
import numpy as np
a64 = np.zeros((3, 4), dtype=np.int64)
a32 = a64.astype(np.int32)
print("strides int64:", a64.strides)
print("strides int32:", a32.strides)Output yang Dihasilkan:
strides int64: (32, 8)
strides int32: (16, 4)- Baris 5 (
astype): array disalin ke dtypeint32yang elemennya 4 byte. - Baris 6-7: stride baris menjadi 16 byte (empat elemen x 4 byte) dan stride kolom menjadi 4 byte — pola
(baris, kolom) = (4 x itemsize, itemsize)terjaga.
Memahami strides melengkapi dua bab sebelumnya: kontinuitas pada Chapter Contiguous vs Non-contiguous hanyalah kasus strides “rapi”, dan operasi seperti reshape pada Chapter reshape memutuskan antara view atau copy dengan membaca angka yang sama ini.