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:

python
import numpy as np

try:
    np.array_api
except AttributeError as e:
    print("AttributeError:", e)

Output yang Dihasilkan:

text
AttributeError: `numpy.array_api` is not available from numpy 2.0 onwards

Yang terjadi di balik layar:

  1. Baris 4 (np.array_api): mengakses atribut memicu pencarian di namespace NumPy; karena submodul itu telah dihapus, NumPy 2 melempar AttributeError alih-alih kegagalan impor yang samar.
  2. 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:

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

text
True
[15 25]

Bedah singkat:

  1. Baris 4 (a.__array_namespace__()): method mengembalikan namespace pustaka pemilik array — untuk ndarray NumPy, jawabannya modul numpy itu sendiri (xp is np bernilai True).
  2. Baris 6 (xp.asarray(...)): semua pemanggilan fungsi dikerjakan melalui namespace hasil penelusuran, bukan lewat np yang 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).

Dengan __array_namespace__(), sebuah fungsi dapat ditulis hanya memakai operasi yang dijamin ada di standar — asarray, mean, std — sehingga bekerja pada namespace mana pun:

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

text
[-1.22474487  0.          1.22474487]

Penjelasannya:

  1. Baris 4-5 (xp = x.__array_namespace__()): fungsi tidak mengimpor pustaka apa pun; ia menanyakan namespace kepada inputnya sendiri.
  2. Baris 6 (xp.asarray(x)): konversi aman bila pemanggil menyerahkan list atau tipe asing; bila input sudah array yang tepat, asarray tidak menyalin.
  3. Baris 7: (x - mean) / std memakai aritmetika yang sama di semua pustaka — std dengan ddof=0 adalah perilaku yang dibakukan standar, senada dengan bab Variance dan Standard Deviation.

Subset operasi inti yang dibakukan standar dan sering dipakai:

KebutuhanFungsi yang dibakukan
Konversi masukasarray
Statistikmean, std, var, sum, min, max
Pembentukanreshape, concat, stack, squeeze
Pembuatanarange, linspace, zeros, ones, eye
Logika & maskerwhere, 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:

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

text
[27.5 30.  28.1] float64
rata-rata: 28.53333333333333

Mari kita baca:

  1. 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.
  2. Baris 7-8 (np.asarray(...)): NumPy memanggil kontrak itu dan menerima ndarray float64; np.mean selanjutnya 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.