Namespace np.char adalah modul string warisan NumPy yang telah ada sejak era 1.x. Jutaan baris kode analisis data masih memanggil np.char.split, np.char.join, atau np.char.add, sehingga kita tetap perlu memahaminya meskipun NumPy 2.x telah meluncurkan penerusnya, np.strings. Keduanya berdampingan di NumPy 2.1.3: kode lama tetap berjalan, sementara fungsi baru bertahap berpindah ke np.strings.
Chapter ini mengisi celah yang tertinggal pada Chapter Pencarian dan Penggantian String: fungsi split dan join yang belum tersedia di np.strings. Kita juga menyusun tabel perbandingan dengan Python str murni, lalu menutup dengan strategi migrasi yang bertahap. Latar belakang dtype string <U tersedia pada Chapter Tipe Data String dan Object.
Fungsi Andalan np.char #
np.char.split memecah setiap elemen menjadi daftar kata, sedangkan np.char.join menyisipkan pemisah di antara karakter-karakter setiap elemen. Perhatikan bahwa keduanya memiliki semantik yang berbeda:
import numpy as np
menu = np.array(["kopi gula", "teh tarik", "roti bakar"])
print(np.char.split(menu))
print(np.char.join("-", np.array(["1042", "2088"])))Output yang Dihasilkan:
[list(['kopi', 'gula']) list(['teh', 'tarik']) list(['roti', 'bakar'])]
['1-0-4-2' '2-0-8-8']- Baris 4 (
np.char.split(menu)): hasilnya adalah array bertipeobjectyang setiap elemennya berupa list Python berisi kata-kata hasil pemecahan. - Baris 5 (
np.char.join(...)): setiap elemen diperlakukan sebagai urutan karakter, sehingga pemisah-disisipkan di antara setiap digit, bukan di antara kata.
Fungsi penyambung dan pengganda juga tersedia, termasuk mod yang menerapkan format gaya printf pada setiap elemen:
import numpy as np
awalan = np.array(["ID-", "NP-"])
nomor = np.array(["101", "202"])
print(np.char.add(awalan, nomor))
print(np.char.multiply(np.array(["ha", "hi"]), 3))
print(np.char.mod("Rp%d", np.array([15000, 27500])))Output yang Dihasilkan:
['ID-101' 'NP-202']
['hahaha' 'hihihi']
['Rp15000' 'Rp27500']np.char.addmenyambung dua array elemen-demi-elemen; argumennya juga menerima string Python yang di-broadcast ke seluruh elemen, misalnyanp.char.add(awalan, "10")menghasilkan['ID-10' 'NP-10'].np.char.multiplymengulang setiap elemen sebanyaknkali.np.char.modsetara dengan"Rp%d" % nilaipada setiap elemen.
Perbandingan np.char, np.strings, dan Python str #
Ketiga pendekatan berikut punya karakter yang berbeda. Tabel ini merangkum perbandingannya pada NumPy 2.1.3:
| Aspek | np.char | np.strings | Python str + list comprehension |
|---|---|---|---|
| Implementasi | Sebagian fungsi umum kini didelegasikan ke ufunc; sisanya lewat _vec_string (panggil method str per elemen) | Ufunc C murni, vectorized penuh | Loop Python murni |
| Kecepatan | Sama dengan np.strings untuk fungsi yang didelegasikan; lebih lambat untuk split/join | Paling cepat | Kompetitif untuk operasi tunggal sederhana |
| Kelengkapan (2.1.3) | Paling lengkap, termasuk split/join | Bertahap; split/join belum ada | Semua method str tersedia |
| Hasil | Array NumPy | Array NumPy | List Python, perlu konversi ulang ke array |
Kita bisa memverifikasi kelengkapan keduanya lewat probe hasattr:
import numpy as np
for ns in (np.char, np.strings):
print(ns.__name__, "split:", hasattr(ns, "split"),
"join:", hasattr(ns, "join"), "upper:", hasattr(ns, "upper"))
print(np.char.upper(np.array(["budi", "siti"])))
print(np.strings.upper(np.array(["budi", "siti"])))Output yang Dihasilkan:
numpy.char split: True join: True upper: True
numpy.strings split: False join: False upper: True
['BUDI' 'SITI']
['BUDI' 'SITI']Strategi Migrasi Kode Lama #
Kode np.char lama tetap berjalan di NumPy 2.x tanpa peringatan penghentian, sehingga migrasi boleh bertahap. Urutan langkah yang kami sarankan:
- Jangan buru-buru mengganti. Kode
np.charyang sudah teruji tetap benar di 2.x; ubah hanya saat file tersebut memang sedang disentuh. - Ganti yang sudah tersedia. Untuk fungsi yang ada di kedua namespace (
upper,lower,strip,replace,startswith, dan lainnya), arahkan pemanggilan baru kenp.strings. - Tunda yang belum tersedia.
np.char.splitdannp.char.jointetap dipakai; tambahkan komentar penanda agar mudah dicari saat NumPy menyediakan padanannya. - Uji ulang setelah mengganti. Pastikan dtype dan isi hasil tidak berubah, mengikuti pola verifikasi pada Chapter Migrasi NumPy 1.x ke 2.x.
Ada satu jebakan migrasi yang mengejutkan: menyambung kembali hasil np.char.split dengan np.char.join tidak berfungsi di 2.1.3, karena join belum menerima array berisi list:
import numpy as np
kata = np.char.split(np.array(["kopi gula"]))
try:
print(np.char.join("-", kata))
except TypeError as e:
print("TypeError:", e)
print(["-".join(k) for k in kata])Output yang Dihasilkan:
TypeError: currently only the no-argument instantiation is supported; use `np.dtype` instead.
['kopi-gula']Sebagai penutup, keputusan praktisnya singkat: pakai np.strings untuk kode baru, pertahankan np.char untuk split/join dan kode warisan, dan gunakan Python str biasa bila logikanya terlalu rumit untuk diufunc-kan.