Ekosistem array Python tidak berhenti di NumPy: CuPy memakai GPU, PyTorch dan JAX menambahkan gradien otomatis, Dask mendistribusikan data, Sparse menghemat memori. Semuanya menawarkan array dengan API yang mirip tetapi tidak persis sama — dan kode pustaka yang mendukung semuanya perlu dasar hukum yang jelas. Dasar itulah Python Array API standard (dikoordinasikan konsorsium data-apis.org): spesifikasi yang menyeragamkan nama fungsi, urutan argumen, dan perilaku inti antar pustaka array.
Karena inisiatif ini masih berkembang, bab ini juga menguji status numpy.array_api — namespace eksperimental NumPy yang dulu menjadi wahana penerapan standar — langsung di NumPy 2.1.3.
Status numpy.array_api di NumPy 2.x #
Pada era NumPy 1.22–1.26, namespace numpy.array_api tersedia sebagai implementasi eksperimental standar. Di NumPy 2 ia sudah tidak ada; aksesnya ditolak dengan pesan yang eksplisit:
import numpy as np
try:
np.array_api
except AttributeError as e:
print("AttributeError:", e)Output yang Dihasilkan:
AttributeError: `numpy.array_api` is not available from numpy 2.0 onwardsYang terjadi di balik layar:
- Baris 4 (
np.array_api): mengakses atribut memicu pencarian di namespace NumPy; karena submodul itu telah dihapus, NumPy 2 melemparAttributeErroralih-alih kegagalan impor yang samar. - Baris 5-7 (
try/except): pesan errornya sendiri menjadi dokumentasi — implementasi eksperimental dihentikan, dan arah barunya adalah menjadikan namespace utama NumPy sendiri mendekati standar.
array_namespace: Menemukan Namespace Objek #
Standar menetapkan satu method sederhana untuk mencari tahu “pustaka array apa yang menopang objek ini”: __array_namespace__(). ndarray NumPy 2 menerapkannya, sehingga kita dapat membuktikannya tanpa pustaka tambahan:
import numpy as np
a = np.arange(4)
xp = a.__array_namespace__()
print(xp is np)
print(xp.asarray([10, 20]) + 5)Output yang Dihasilkan:
True
[15 25]Bedah singkat:
- Baris 4 (
a.__array_namespace__()): method mengembalikan namespace pustaka pemilik array — untuk ndarray NumPy, jawabannya modulnumpyitu sendiri (xp is npbernilaiTrue). - Baris 6 (
xp.asarray(...)): semua pemanggilan fungsi dikerjakan melalui namespace hasil penelusuran, bukan lewatnpyang ditulis keras di kode.
Untuk array CuPy atau PyTorch yang ikut standar, method yang sama mengembalikan namespace masing-masing — satu pintu masuk untuk semua pustaka. Konvensi penamaan komunitas memakai variabel xp (kependekan dari XP, sebutan umum untuk namespace array-api-compliant).
Menulis Fungsi yang Portabel #
Dengan __array_namespace__(), sebuah fungsi dapat ditulis hanya memakai operasi yang dijamin ada di standar — asarray, mean, std — sehingga bekerja pada namespace mana pun:
import numpy as np
def normalisasi(x):
xp = x.__array_namespace__()
x = xp.asarray(x)
return (x - xp.mean(x)) / xp.std(x)
a = np.array([2.0, 4.0, 6.0])
print(normalisasi(a))Output yang Dihasilkan:
[-1.22474487 0. 1.22474487]Penjelasannya:
- Baris 4-5 (
xp = x.__array_namespace__()): fungsi tidak mengimpor pustaka apa pun; ia menanyakan namespace kepada inputnya sendiri. - Baris 6 (
xp.asarray(x)): konversi aman bila pemanggil menyerahkan list atau tipe asing; bila input sudah array yang tepat,asarraytidak menyalin. - Baris 7:
(x - mean) / stdmemakai aritmetika yang sama di semua pustaka —stddenganddof=0adalah perilaku yang dibakukan standar, senada dengan bab Variance dan Standard Deviation.
Subset operasi inti yang dibakukan standar dan sering dipakai:
| Kebutuhan | Fungsi yang dibakukan |
|---|---|
| Konversi masuk | asarray |
| Statistik | mean, std, var, sum, min, max |
| Pembentukan | reshape, concat, stack, squeeze |
| Pembuatan | arange, linspace, zeros, ones, eye |
| Logika & masker | where, isnan, isfinite, logical_and |
Perlu diingat: standar sengaja lebih kecil daripada NumPy. Fungsi seperti np.loadtxt atau API lama tidak masuk daftar; kode portabel menyisihkan bagian itu ke sisi NumPy murni.
Duck Array dan np.asarray #
Lapisan paling awal interoperabilitas adalah duck array: objek dari pustaka lain yang menyediakan __array__. NumPy menerimanya lewat np.asarray, dan setelah dikonversi, seluruh fungsi NumPy dapat bekerja dengannya:
import numpy as np
class CuacaDuck:
def __array__(self, dtype=None):
return np.array([27.5, 30.0, 28.1])
a = np.asarray(CuacaDuck())
print(a, a.dtype)
print("rata-rata:", np.mean(a))Output yang Dihasilkan:
[27.5 30. 28.1] float64
rata-rata: 28.53333333333333Mari kita baca:
- Baris 3-5 (
class CuacaDuck): kelas sederhana yang mengaku “saya bisa menjadi array” lewat__array__— kontrak yang sama seperti pada bab Array Conversion dan Memory Sharing. - Baris 7-8 (
np.asarray(...)): NumPy memanggil kontrak itu dan menerima ndarrayfloat64;np.meanselanjutnya bekerja tanpa tahu asal usul objeknya.
Dua kalimat penutup: np.asarray adalah lapisan toleransi — menerima apa pun yang berbentuk array; __array_namespace__ adalah lapisan identitas — mengetahui pustaka siapa yang menopang array itu. Kode pustaka yang baik memakai keduanya berurutan: konversi bila perlu, lalu lanjutkan bekerja di namespace milik input.