Nama pelanggan, alamat, dan catatan pesanan jarang punya panjang yang seragam. dtype <U menyimpan teks dalam sel berlebar tetap: lebar ditentukan oleh string terpanjang, lalu setiap elemen membayar memori sebesar itu. Chapter Tipe Data String dan Object sudah memperlihatkan dua konsekuensinya, yaitu truncation senyap saat assignment dan ruang kosong yang ikut dialokasikan untuk elemen pendek.

NumPy 2.0 menjawab masalah ini dengan StringDType, dtype string variabel-panjang yang menyimpan teks apa adanya. Namun ada kebiasaan lama yang tidak bisa dibawa ke sini: menulis dtype sebagai literal string. Pembuatan StringDType harus melewati namespace np.dtypes, tempat semua kelas dtype resmi NumPy tinggal.

Empat hal berikut menjadi peta pembahasan kita:

  1. Keterbatasan dtype <U saat data tidak seragam.
  2. Cara membuat StringDType lewat np.dtypes dan jebakan literal dtype.
  3. Opsi na_object untuk nilai hilang.
  4. Tabel perbandingan <U, StringDType, dan object, plus kelas dtype lain di np.dtypes.

Keterbatasan dtype <U pada Data Tidak Seragam #

Ketika array dibuat dari list string, NumPy mengukur string terpanjang dan menetapkan lebar itu untuk semua elemen. Setiap karakter memakai 4 byte, sehingga satu elemen <U12 selalu 48 byte, sependek apa pun isinya. Assignment yang melebihi lebar juga terpotong tanpa peringatan.

python
import numpy as np

nama = np.array(["Budi", "Dewi Kartika"])
print(nama.dtype)
print(nama.nbytes)

nama[0] = "Kepulauan Bangka Belitung"
print(nama)

Output yang Dihasilkan:

text
<U12
96
['Kepulauan Ba' 'Dewi Kartika']

Kita bedah baris demi baris:

  1. Baris 3 (np.array(...)): string terpanjang "Dewi Kartika" memiliki 12 karakter, sehingga NumPy menetapkan dtype <U12 dan mengalokasikan 4 x 12 = 48 byte untuk setiap elemen.
  2. Baris 5 (nama.nbytes): hasilnya 96 byte untuk 2 elemen, meskipun "Budi" sebenarnya hanya butuh 16 byte. Sisa 32 byte adalah padding untuk elemen pendek.
  3. Baris 7-8 (assignment): string 25 karakter terpotong menjadi 12 karakter pertama, "Kepulauan Ba", tanpa error dan tanpa peringatan. Data hilang diam-diam.

StringDType Dibuat Lewat np.dtypes #

StringDType adalah dtype string variabel-panjang yang menjadi fitur utama NumPy 2.0 untuk teks. Panjang setiap elemen disimpan bersama datanya, sehingga string pendek maupun panjang boleh berdampingan tanpa padding dan tanpa truncation. Kekeliruan yang paling sering dialami adalah menulisnya sebagai literal dtype, seperti kebiasaan pada "U3" atau "float64"; literal tersebut belum dikenali di NumPy 2.1.3. Jalur resminya adalah np.dtypes, namespace berisi kelas pabrik (factory) untuk membuat dtype secara eksplisit.

python
import numpy as np

try:
    np.array(["Jakarta", "Bandung"], dtype="StringDType")
except TypeError as e:
    print("TypeError:", e)

sdt = np.dtypes.StringDType()
kota = np.array(["Jakarta", "Bandung"], dtype=sdt)
print(kota)
print(kota.dtype)

kota[0] = "Kepulauan Bangka Belitung"
print(kota)

Output yang Dihasilkan:

text
TypeError: data type 'StringDType' not understood
['Jakarta' 'Bandung']
StringDType()
['Kepulauan Bangka Belitung' 'Bandung']

Penjelasan tiap bagian:

  1. Baris 3-6 (try/except): np.array dengan dtype="StringDType" memunculkan TypeError: data type 'StringDType' not understood. Blok tetap lulus karena error ditangkap dan dicetak.
  2. Baris 8 (np.dtypes.StringDType()): pemanggilan kelas pabrik ini menghasilkan objek dtype bernama StringDType(), yang langsung dipakai sebagai argumen dtype.
  3. Baris 12 (assignment panjang): string 25 karakter masuk utuh, tidak ada truncation, dan lebar elemen lain tidak ikut berubah.

Opsi na_object untuk Nilai Hilang #

Kolom teks pada dataset nyata sering memiliki sel kosong. Secara default StringDType tidak menyediakan penanda nilai hilang; dukungan itu aktif ketika na_object diberikan saat dtype dibuat. Objek apa pun boleh dipilih sebagai sentinel, misalnya bilangan -1; hanya nilai yang sama dengan sentinel itulah yang diperlakukan sebagai nilai hilang saat array dibuat atau diisi.

python
import numpy as np

sdt = np.dtypes.StringDType(na_object=-1)
kota = np.array(["Jakarta", -1, "Bandung"], dtype=sdt)
print(kota)
print(kota.dtype)

kota[1] = "Semarang"
print(kota)

Output yang Dihasilkan:

text
['Jakarta' -1 'Bandung']
StringDType(na_object=-1)
['Jakarta' 'Semarang' 'Bandung']

Yang perlu dicermati:

  1. Baris 3 (dtype dengan na_object=-1): nilai -1 pada list input dikenali sebagai sentinel dan dicetak tanpa tanda kutip, berbeda dari string yang selalu berkutip.
  2. Baris 4 (kota.dtype): repr dtype ikut menampilkan konfigurasinya, StringDType(na_object=-1), sehingga dua dtype dengan sentinel berbeda tetap mudah dibedakan.
  3. Baris 7 (isi ulang): sel nilai hilang boleh diisi string biasa kapan saja; sentinel hanya sebuah penanda, bukan keadaan permanen.

Tabel Perbandingan dan Keluarga np.dtypes #

Ketiga jalur penyimpanan teks kini bisa kita susun dalam satu tabel, dengan angka memori yang diambil langsung dari blok kode sebelumnya.

Aspekdtype <UStringDTypedtype object
Panjang stringTetap (lebar terpanjang)VariabelVariabel
Memori 2 elemen di atas96 byte32 byte16 byte + objek str di heap
Assignment melebihi lebarTerpotong senyapMasuk utuhMasuk utuh
Nilai hilang bawaanTidak adaOpsi na_objectDisiasati sendiri
Operasi np.stringsCepat (ufunc di C)CepatLebih lambat (objek Python)

Angka 16 byte pada kolom object hanyalah ukuran pointer per elemen; objek str Python aslinya terpisah di heap, sehingga pemakaian memori nyata lebih besar dan setiap operasi harus keluar dari C.

Namespace np.dtypes tidak hanya berisi StringDType. Kelas pabrik lain menghasilkan dtype bawaan yang sudah kita kenal, dan beberapa menerima argumen lebar seperti StrDType:

python
import numpy as np

print(np.dtypes.Float64DType())
print(np.dtypes.Int64DType())
print(np.dtypes.BoolDType())
print(np.dtypes.StrDType(5))

Output yang Dihasilkan:

text
float64
int64
bool
<U5

Dengan dtype variabel-panjang dan tabel ini, persamaan serta perbedaan ketiga jalur penyimpanan teks dari Chapter Tipe Data String dan Object kini terpetakan tuntas. Bab berikutnya mulai memakai teks tersebut secara nyata lewat fungsi string vectorized di namespace np.strings.