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:

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

text
[list(['kopi', 'gula']) list(['teh', 'tarik']) list(['roti', 'bakar'])]
['1-0-4-2' '2-0-8-8']
  1. Baris 4 (np.char.split(menu)): hasilnya adalah array bertipe object yang setiap elemennya berupa list Python berisi kata-kata hasil pemecahan.
  2. 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:

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

text
['ID-101' 'NP-202']
['hahaha' 'hihihi']
['Rp15000' 'Rp27500']
  • np.char.add menyambung dua array elemen-demi-elemen; argumennya juga menerima string Python yang di-broadcast ke seluruh elemen, misalnya np.char.add(awalan, "10") menghasilkan ['ID-10' 'NP-10'].
  • np.char.multiply mengulang setiap elemen sebanyak n kali.
  • np.char.mod setara dengan "Rp%d" % nilai pada 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:

Aspeknp.charnp.stringsPython str + list comprehension
ImplementasiSebagian fungsi umum kini didelegasikan ke ufunc; sisanya lewat _vec_string (panggil method str per elemen)Ufunc C murni, vectorized penuhLoop Python murni
KecepatanSama dengan np.strings untuk fungsi yang didelegasikan; lebih lambat untuk split/joinPaling cepatKompetitif untuk operasi tunggal sederhana
Kelengkapan (2.1.3)Paling lengkap, termasuk split/joinBertahap; split/join belum adaSemua method str tersedia
HasilArray NumPyArray NumPyList Python, perlu konversi ulang ke array

Kita bisa memverifikasi kelengkapan keduanya lewat probe hasattr:

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

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

  1. Jangan buru-buru mengganti. Kode np.char yang sudah teruji tetap benar di 2.x; ubah hanya saat file tersebut memang sedang disentuh.
  2. Ganti yang sudah tersedia. Untuk fungsi yang ada di kedua namespace (upper, lower, strip, replace, startswith, dan lainnya), arahkan pemanggilan baru ke np.strings.
  3. Tunda yang belum tersedia. np.char.split dan np.char.join tetap dipakai; tambahkan komentar penanda agar mudah dicari saat NumPy menyediakan padanannya.
  4. 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:

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

text
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.