Saturday, February 14, 2026

Numpy Tingkat Lanjut

Ada beberapa perintah untuk menaikkan skill pemrograman Python Numpy (dan Scipy) ke level lanjut. Jika Anda (termasuk saya) paham dan bisa menginterpretasikan output perintah tersebut, maka kita sudah siap naik ke level Numpy selanjutnya. Beberapa perintah tersebut adalah sebagai berikut.

1. Blok Memory (np.nbytes)

Sering kali kita hanya fokus pada bentuk (shape) array, namun melupakan "berat"nya. Perintah `np.nbytes` menginformasikan berapa banyak memori RAM yang sebenarnya kita pakai.  Seseorang yang paham bahwa mengubah tipe data (dtype) dari float64 ke float32 bisa memangkas konsumsi memori hingga 50%, yang berarti mempercepat proses komputasi secara drastis. Di sini, kita belajar bahwa array bukan sekadar wadah angka, tetapi blok memori yang harus dikelola secara efisien.

Contoh: 
import numpy as np

a = np.zeros((1000, 1000), dtype=np.float64)
print(a.nbytes)
# Karena float64 = 8 byte, maka total memori:
# 1000 x 1000 x 8 byte = 8.000.000 byte (~8 MB)
Konsep penting:
  • Ukuran memori = jumlah elemen × ukuran tipe data.
  • Mengganti float64 ke float32 langsung mengurangi memori setengahnya.
  • Pada skala besar (misalnya deep learning atau audio processing), ini sangat krusial.
Jika kita tidak sadar ukuran memori, kita akan mudah “membunuh” RAM sendiri.

2. Stride

Jika nbytes adalah beratnya, maka stride adalah cara kita melangkah di atas memori tersebut. Stride menentukan berapa byte yang harus "diloncati" komputer untuk menuju ke elemen berikutnya di setiap dimensi. Stride adalah jarak (dalam byte) yang harus dilompati untuk berpindah ke elemen berikutnya pada setiap dimensi. Konsep inilah yang menjawab misteri mengapa operasi transpose pada array besar bisa sangat cepat. Karena Numpy tidak benar-benar memindahkan data di memori; ia hanya mengubah pola langkah (stride) tersebut. Memahami stride berarti memahami bagaimana komputer "melihat" data array secara linear di dalam RAM.


Contoh:
a = np.arange(12).reshape(3, 4)  
print(a.strides)  
# Jika dtype=int64 (8 byte), kemungkinan output:
(32, 8)
Artinya:
  • Untuk pindah ke baris berikutnya → lompat 32 byte (4 kolom × 8 byte).
  • Untuk pindah ke kolom berikutnya → lompat 8 byte.
Ini penting karena:
  • Operasi transpose (a.T) sering tidak membuat copy data, hanya mengubah stride.
  • Pemahaman stride membantu kita tahu kapan NumPy membuat copy atau hanya view. 
  • Dalam optimasi performa, akses memori yang kontigu jauh lebih cepat. 
Stride adalah jembatan antara konsep matematis array dan realitas fisik memori.

3. Broadcasting

Broadcasting adalah seni "mengada-ada" secara efisien. Broadcasting memungkinkan operasi antara array dengan ukuran yang berbeda tanpa perlu menyalin data secara fisik untuk menyamakan ukurannya. Misalnya, menjumlahkan array (3,3) dengan vektor (3,) secara otomatis. Seorang programmer biasa mungkin akan melakukan looping atau padding manual, tetapi level "Dewa" membiarkan Numpy melakukan broadcasting internal yang jauh lebih cepat karena terjadi di level C. Kita hemat memori, kita hemat waktu.

Contoh:
a = np.array([[1], [2], [3]])
b = np.array([10, 20, 30])

c = a + b

Secara mental:

  • a bentuk (3,1)
  • b bentuk (3,)
  • NumPy “membentangkan” dimensi agar cocok → hasil (3,3)

Tanpa broadcasting, kita harus membuat array besar secara manual. Dengan broadcasting:

  • Kode lebih ringkas
  • Lebih hemat memori
  • Lebih cepat

Kunci memahami broadcasting:

  • Dimensi dibandingkan dari kanan ke kiri
  • Ukuran cocok jika sama atau salah satunya 1
Kalau ini sudah bisa kita prediksi tanpa menjalankan kode, berarti otak kita sudah mulai “NumPy-native”.

4. Fancy Indexing

Fancy indexing adalah indexing menggunakan array atau list indeks. Berbeda dengan slicing biasa yang menghasilkan view (tampilan tanpa menyalin data), Fancy Indexing selalu menghasilkan copy (data baru). Memahami perbedaan ini krusial agar kita tidak membludakkan memori secara tidak sengaja saat memproses data besar.


Contoh:
a = np.array([10, 20, 30, 40])
idx = [0, 2]
print(a[idx])
[10 30]
Perbedaan penting:
  • Slice (a[1:3]) → biasanya view (tidak copy)
  • Fancy indexing → selalu membuat copy
Ini sangat penting untuk:
  • Mengontrol penggunaan memori
  • Menghindari bug akibat modifikasi data yang tidak disengaja
Misalnya:
b = a[idx]
b[0] = 999
Di sini, a tidak akan berubah karena b adalah copy.
Kalau kita tidak memahami ini, kita bisa salah kaprah saat debugging.

5. Vectorization

Vectorization adalah teknik menghilangkan loop eksplisit (perulangan for di Python) dan menggantinya dengan operasi array tunggal. Loop Python lambat karena interpretasi per-baris, namun operasi vektor Numpy terjadi di level kompilasi C/Fortran yang sangat cepat. Ketika kita memahami Broadcasting, Stride, dan Memory, Vectorization menjadi senjata utama untuk membuat kode berjalan 10x hingga 100x lebih kencang.
Berikut contoh penggunaan vektorisasi untuk menggantikan perulangan for.
Perulangan for:
result = []
for x in a:
    result.append(x * 2)
Vektorisasi:
result = a * 2
Kenapa jauh lebih cepat? Loop Python berjalan di level interpreter (lambat). Operasi NumPy berjalan di C (cepat). Akses memori lebih efisien. Vectorization bukan sekadar “gaya”, tapi filosofi berpikir: Berpikir dalam bentuk operasi matriks, bukan iterasi elemen.

Perlu diingat, bagian terpenting adalah memahami konsep array dengan perintah di atas pada tataran level otak kita, bukan simulasi komputer. Artinya, kita bisa menebak output dari komputer (simulasi/Python Numpy) dengan otak kita dan memahaminya. Bukan asal mensimulasikan array, meskipun bisa menebak hasilnya. Inilah yang terpenting: ilmu sebelum beramal.

Referensi: 
[1] https://shihchinw.github.io/2019/03/performance-tips-of-numpy-ndarray.html 
[2] https://pythonspeed.com/articles/numpy-memory-footprint/

Saturday, January 31, 2026

Interval walking di musim dingin

Interval Walking Training (IWT), atau yang dikenal sebagai teknik berjalan interval, merupakan cara sederhana namun sangat efektif untuk meningkatkan kesehatan: cukup bergantian antara jalan cepat (fast walking) dan jalan lambat (slow walking) dalam sesi sekitar 30 menit, misalnya 5 menit cepat lalu 5 menit lambat secara bergiliran. Berbeda dengan jalan biasa, metode asal Jepang ini telah dibuktikan secara ilmiah melalui berbagai studi besar—melibatkan ribuan partisipan—mampu mengontrol kadar gula darah pada penderita diabetes, menurunkan tekanan darah, mengurangi risiko stroke, serta memperbaiki kondisi hipertensi, gejala depresi, kualitas tidur, dan kekuatan fisik secara keseluruhan, termasuk peningkatan kapasitas aerobik serta kekuatan otot kaki yang lebih unggul dibandingkan jalan konstan. Kini, IWT semakin populer di seluruh dunia dan bahkan mulai diintegrasikan ke dalam program rehabilitasi jantung (cardiac rehabilitation) dengan pemantauan jarak jauh, menjadikannya solusi praktis, aman, dan mudah diikuti bagi siapa saja yang ingin hidup lebih sehat tanpa peralatan mahal atau gym. 

Bagaimana memanfaatkan IWT pada musim dingin? 

Secara tidak sengaja, saya "menemukan" metode IWT dengan memanfaatkan dinginnya musim dingin. Setiap hari ketika bekerja, saya butuh berjalan kaki ke tempat sholat, berpindah gedung. Nah, di saat keluar dari gedung dengan udara yang lebih dingin daripada di dalam gedung, saya mempercepat jalan saya, dengan harapan segera masuk ke gedung lain sekaligus menambah pergerakan agar badan lebih hangat. Ketika masuk gedung lain, saya memperlambat kecepatan jalan saya. Ini yang saya maksud dengan IWT di musim dingin. Singkatnya:

  • Indoor: jalan lambat
  • Outdoor: jalan cepat
Tidak hanya di musim dingin, IWT indoor (lambat)-outdoor (cepat) tersebut juga tidak sengaja saya praktekkan di musim yang lain. Mungkin sudah terbiasa. Suatu ketika teman saya berkata kalau di luar gedung jalan saya cepat sekali.

Wednesday, January 07, 2026

Fix Japanese garbled character

 To fix garbled Japanese characters, use the `nkf` command. You need to install it first since it is usually not available by default in most Linux platforms. Then, using the following command to convert its encoding (detected by default) to a readable one.   

$ nkf old_file.txt > new_file.txt 
An example of output is below.

Tuesday, January 06, 2026

Permasalahan smartwach (The problem with smartwatch)

Saya menyukai memakai jam, dengannya saya bisa tahu waktu. Utamanya waktu untuk sholat dan melakukan aktivitas lainnya. Dengan adanya smartwatch, tidak hanya waktu saja informasi yang saya dapatkan, melainkan lama tidur, detak jantung, dan jumlah langkah (step tracker). Informasi itu sangat bermanfaat. Misalnya, dalam sehari saya menargetkan tidur tujuh jam, jika kurang dari itu (informasi dari smartwatch), saya bisa menambah jam tidur saya. Sebaliknya, jika siang/sore saya sudah tidur 1-2 jam, maka malamnya saya bisa tidur lebih singkat. 

Begitu juga untuk langkah kaki, kalau saya menargetkan tiap harinya harus berjalan 7000 langkah, jika kurang saya bisa menambahnya. Bahkan, saya bisa merangkum data-data itu, seperti yang saya jelaskan di sini: 

https://bagustris.blogspot.com/2021/05/data-jalan-kaki-tidur-dan-detak-jantung.html

Tapi ada satu permasalahan besar pada smartwatch. Apa itu? Sangat tidak masuk akal bagi saya jika saya harus mengisi daya (charge) smartwatch tersebut tiap minggu. Karenanya, dua smartwatch yang saya pakai sebelumnya berdaya tahan lama, Xiaomi Band 4 dan Amazfit Band 7. Keduanya memiliki rentang hidup (lifetime) selama kurang lebih tiga-empat minggu (21-28 hari) untuk sekali isi daya dengan mode power saver. 

Saat ini saya tidak memakai smartwatch lagi, hanya Casio yang memiliki fitur step tracker yang bisa bertahan 10 tahun tanpa diisi daya, cukup mengganti baterainya. Saat itu saya sedang dalam perjalanan selama tiga minggu, dan saya mengandalkan smartwatch untuk bisa bertahan sepanjang waktu itu. Ternyata kapasitasnya menurun, baru dua minggu sudah mati, dan saya tidak membawa kabel pengisian dayanya. Saat itu juga saya beralih ke jam tangan yang tidak perlu diisi daya, tahan lama, memiliki fitur step tracker, dual time, dan fitur-fitur lainnya.  

Related Posts Plugin for WordPress, Blogger...