NumPy 2.0 yang dirilis Juni 2024 adalah versi mayor pertama yang mengubah API secara besar-besaran sejak seri 1.x. Kode yang berjalan di NumPy 1.x belum tentu berjalan apa adanya di 2.x: sejumlah alias dihapus dari modul, sejumlah fungsi ditandai deprecated, dan tampilan repr scalar berubah bentuk. Sebelum memigrasi proyek, kita perlu tahu persis mana yang berubah dan apa penggantinya.
Bab ini merangkum perubahan yang paling sering ditemui saat migrasi. Seluruh contoh dieksekusi di NumPy 2.1.3, sehingga pesan error dan peringatan yang tampil adalah pesan asli dari versi tersebut:
- Tabel pengganti untuk empat nama lama yang paling umum.
- Cara membuktikan nama yang dihapus dan cara menangkap peringatan deprecated.
- Perubahan repr scalar dan implikasinya pada log maupun tes.
- Urutan langkah migrasi yang aman.
Alias dan API yang Berubah #
Empat nama lama berikut paling sering muncul di kode 1.x. Dua nama pertama dihapus total dari modul numpy; dua berikutnya masih dapat dipanggil tetapi sudah memunculkan DeprecationWarning:
| Kode lama (NumPy 1.x) | Pengganti (NumPy 2.x) | Status di 2.1.3 |
|---|---|---|
np.float_ | np.float64 | dihapus, memunculkan AttributeError |
np.NaN | np.nan | dihapus, memunculkan AttributeError |
np.in1d | np.isin | deprecated, memunculkan DeprecationWarning |
np.row_stack | np.vstack | deprecated, memunculkan DeprecationWarning |
Untuk nama yang dihapus, NumPy sengaja memunculkan AttributeError dengan pesan yang menyebut penggantinya. Kita bisa membuktikannya dengan membungkus akses nama lama dalam try/except — pola yang aman dipakai di skrip pemeriksaan agar skrip tetap berjalan sampai selesai:
import numpy as np
try:
np.float_
except AttributeError as e:
print("AttributeError:", e)
try:
np.NaN
except AttributeError as e:
print("AttributeError:", e)Output yang Dihasilkan:
AttributeError: `np.float_` was removed in the NumPy 2.0 release. Use `np.float64` instead.
AttributeError: `np.NaN` was removed in the NumPy 2.0 release. Use `np.nan` instead.Baris demi baris:
- Baris 3-6 (
try: np.float_): ekspresinp.float_dievaluasi di dalam blok try; modul numpy mengenali nama yang sudah dihapus dan memunculkan AttributeError berisi saran pengganti, lalu pesan itu tercetak apa adanya. - Baris 7-10 (
try: np.NaN): perlakuan sama untuknp.NaN; pesannya menunjuknp.nan. Dua pesan di atas persis seperti yang dilihat siapa pun yang menjalankan kode lama di 2.x — sifat ramah ini memudahkan pencarian nama yang perlu diperbaiki.
Sementara itu, np.in1d dan np.row_stack masih dieksekusi di 2.1.3, tetapi setiap pemanggilannya memunculkan DeprecationWarning, dan keduanya dijadwalkan mengikuti jejak np.float_ pada rilis berikutnya. Blok berikut menangkap peringatan itu secara eksplisit supaya tercetak rapi:
import numpy as np
import warnings
nilai = np.array([1, 2, 3, 4, 2])
with warnings.catch_warnings(record=True) as caught:
warnings.simplefilter("always")
np.in1d(nilai, np.array([2, 4]))
np.row_stack([nilai, nilai])
for w in caught:
print(type(w.message).__name__, "-", w.message)Output yang Dihasilkan:
DeprecationWarning - `in1d` is deprecated. Use `np.isin` instead.
DeprecationWarning - `row_stack` alias is deprecated. Use `np.vstack` directly.Baris demi baris:
- Baris 5-8 (
catch_warnings):warnings.catch_warnings(record=True)bersamasimplefilter("always")memaksa Python merekam setiap peringatan, sebab DeprecationWarning lazimnya disaring dan tidak tampil. Kedua fungsi lama tetap menghasilkan nilai; peringatan hanya menemani hasilnya. - Baris 9-10 (
for w in caught): isi rekaman dicetak satu per satu;w.messagememuat teks peringatan asli yang masing-masing sudah menyebut penggantinya.
Menulis Ulang dengan API 2.x #
Pengganti pada tabel bekerja tanpa peringatan dan hasilnya identik untuk kasus umum. np.isin menerima array dan nilai uji seperti np.in1d; np.vstack menumpuk array seperti np.row_stack:
import numpy as np
penjualan = np.array([10, 20, 30, 20])
print(np.isin(penjualan, [20, 30]))
stok_a = np.array([150, 200])
stok_b = np.array([120, 180])
print(np.vstack([stok_a, stok_b]))Output yang Dihasilkan:
[False True True True]
[[150 200]
[120 180]]Pemanggilan np.isin menandai elemen penjualan yang juga ada di daftar [20, 30], sedangkan np.vstack menumpuk dua baris stok menjadi matriks (2, 2). Tidak ada peringatan yang muncul — inilah bentuk kode yang dituju setelah migrasi selesai.
Repr Scalar yang Berubah #
Perubahan yang tidak memunculkan error justru paling sering mengejutkan: tampilan repr scalar. Mengikuti NEP 51, sejak 2.0 repr scalar NumPy mencantumkan tipe nilainya. Pada NumPy 1.x, repr(np.float64(0.1)) hanya mencetak 0.1, sehingga nilai itu tidak bisa dibedakan dari float Python di dalam log. Di 2.x tampilannya berbeda:
import numpy as np
rata = np.mean([70, 80, 90])
print(repr(rata))
print(repr(np.float64(0.1)))
print(repr(0.1))Output yang Dihasilkan:
np.float64(80.0)
np.float64(0.1)
0.1Baris demi baris:
- Baris 3-4 (
np.mean): hasilnp.meanberupa scalarfloat64; repr-nya kini membawa awalannp.float64(...). - Baris 5: nilai 0.1 tampil sebagai
np.float64(0.1)— bentuk baru yang menggantikan0.1polos milik 1.x. - Baris 6: repr float Python biasa tetap
0.1; perubahan ini hanya menyentuh scalar milik NumPy. Manfaatnya, asal nilai terbaca langsung dari log; konsekuensinya, teks output lama yang dibandingkan persis perlu diperbarui.
Langkah Migrasi yang Aman #
Urutan yang lazim dijalankan:
- Catat versi awal proyek dengan
np.__version__seperti dijelaskan pada Chapter Memeriksa Versi NumPy. - Sediakan virtual environment terpisah untuk numpy 2.x agar lingkungan lama tetap tersedia sebagai pembanding.
- Jalankan skrip dan tes dengan
python3 -W error::DeprecationWarningagar setiap pemakaian alias deprecated — termasuknp.in1ddannp.row_stack— berubah menjadi exception dan tidak lolos tanpa terlihat. - Perbaiki satu per satu dengan tabel di atas, lalu jalankan ulang pemeriksaan sampai tidak ada peringatan tersisa.
Dua catatan penutup. Pertama, bila kode lama memakai np.find_common_type, nama ini mengikuti jejak np.float_: pada akhir seri 1.x pemanggilannya memunculkan DeprecationWarning berlabel NPY005, dan di 2.0 fungsi tersebut sudah dihapus; penggantinya adalah np.result_type dan np.promote_types, yang mekanismenya dibedah pada Chapter Aturan Promosi Tipe. Kedua, perubahan lain di 2.x bersifat menambah, misalnya tipe string baru StringDType sebagai arah pengganti dtype <U — dibahas pada Chapter Tipe Data String dan Object.