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.float64dihapus, memunculkan AttributeError
np.NaNnp.nandihapus, memunculkan AttributeError
np.in1dnp.isindeprecated, memunculkan DeprecationWarning
np.row_stacknp.vstackdeprecated, 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:

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

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

  1. Baris 3-6 (try: np.float_): ekspresi np.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.
  2. Baris 7-10 (try: np.NaN): perlakuan sama untuk np.NaN; pesannya menunjuk np.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:

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

text
DeprecationWarning - `in1d` is deprecated. Use `np.isin` instead.
DeprecationWarning - `row_stack` alias is deprecated. Use `np.vstack` directly.

Baris demi baris:

  1. Baris 5-8 (catch_warnings): warnings.catch_warnings(record=True) bersama simplefilter("always") memaksa Python merekam setiap peringatan, sebab DeprecationWarning lazimnya disaring dan tidak tampil. Kedua fungsi lama tetap menghasilkan nilai; peringatan hanya menemani hasilnya.
  2. Baris 9-10 (for w in caught): isi rekaman dicetak satu per satu; w.message memuat teks peringatan asli yang masing-masing sudah menyebut penggantinya.

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:

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

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

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

text
np.float64(80.0)
np.float64(0.1)
0.1

Baris demi baris:

  1. Baris 3-4 (np.mean): hasil np.mean berupa scalar float64; repr-nya kini membawa awalan np.float64(...).
  2. Baris 5: nilai 0.1 tampil sebagai np.float64(0.1) — bentuk baru yang menggantikan 0.1 polos milik 1.x.
  3. 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:

  1. Catat versi awal proyek dengan np.__version__ seperti dijelaskan pada Chapter Memeriksa Versi NumPy.
  2. Sediakan virtual environment terpisah untuk numpy 2.x agar lingkungan lama tetap tersedia sebagai pembanding.
  3. Jalankan skrip dan tes dengan python3 -W error::DeprecationWarning agar setiap pemakaian alias deprecated — termasuk np.in1d dan np.row_stack — berubah menjadi exception dan tidak lolos tanpa terlihat.
  4. 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.