NumPy menyediakan fondasi array, sedangkan SciPy — kami menguji versi 1.14.1 — menumpuk modul bertema: statistik, optimasi, pemrosesan sinyal, pencitraan, aljabar linear lanjutan, dan banyak lagi. Hubungan keduanya paling beruntung bagi kita: SciPy dibangun di atas ndarray, sehingga array NumPy dapat diteruskan ke fungsi SciPy apa pun tanpa konversi. Yang perlu dipelajari hanyalah modul mana yang berisi alat yang kita butuhkan, dan kapan harus kembali ke NumPy.
scipy.sparse: Matriks Jarang #
Data dunia nyata sering berisi nol dominan — tabel interaksi pengguna-produk, matriks kata-dokumen. Modul scipy.sparse menyimpan hanya elemen bukan nol, lalu mengembalikannya ke bentuk padat (dense) saat algoritma membutuhkannya:
import numpy as np
from scipy import sparse
a = np.array([[0, 15000, 0], [0, 0, 20000]])
m = sparse.csr_matrix(a)
print(m.nnz, "dari", a.size, "elemen disimpan")
b = m.toarray()
print(b)
print("identik ->", np.array_equal(a, b))
print("berbagi memori ->", np.shares_memory(a, b))Output yang Dihasilkan:
2 dari 6 elemen disimpan
[[ 0 15000 0]
[ 0 0 20000]]
identik -> True
berbagi memori -> FalseBedah baris demi baris:
- Baris 4: array padat
(2, 3)berisi data omzet dua cabang, sebagian besar nol. - Baris 5-6 (
sparse.csr_matrix(a)): format Compressed Sparse Row menyimpan dua elemen saja (nnz= 2) beserta indeks posisinya; lima dari enam slot memori berisi nol tidak pernah disimpan. - Baris 7-8 (
m.toarray()): kebalikannya membangun kembali array padat; nilainya identik, tetapinp.shares_memorybernilaiFalsekarena buffer padat baru dialokasikan.
scipy.stats di atas Array NumPy #
Modul scipy.stats menerima ndarray secara langsung. Dua fungsi yang paling sering dipakai untuk ringkasan adalah describe untuk statistik lengkap dan pearsonr untuk korelasi beserta p-value:
import numpy as np
from scipy import stats
jam_belajar = np.array([2, 3, 5, 6, 8, 9])
nilai = np.array([60, 65, 70, 75, 82, 88])
r = stats.pearsonr(jam_belajar, nilai)
print("korelasi :", r.statistic)
print("p-value :", r.pvalue)
d = stats.describe(nilai)
print("nobs :", d.nobs)
print("mean :", d.mean)
print("var :", d.variance)Output yang Dihasilkan:
korelasi : 0.9945194436616309
p-value : 4.497243830791634e-05
nobs : 6
mean : 73.33333333333333
var : 110.26666666666664Penjelasannya:
- Baris 5-7 (
stats.pearsonr(...)): kedua array 1-D dipakai apa adanya; hasilnya objekPearsonRResultdengan atributstatisticdanpvalue— korelasi 0,9945 menunjukkan hubungan hampir lurus antara jam belajar dan nilai. - Baris 8-11 (
stats.describe(...)): objekDescribeResultmengemasnobs,mean, danvariance(dengan pembagi n-1) dalam satu pemanggilan.
Pasangan NumPy yang serupa ada di np.corrcoef untuk korelasi matriks dan np.var untuk varians pembagi n — perbandingan keduanya sudah kita bahas pada bab Korelasi dan Kovarians dan Variance dan Standard Deviation.
scipy.linalg versus numpy.linalg #
Untuk aljabar linear, NumPy dan SciPy sama-sama menawarkan solve dan svd, keduanya memanggil pustaka LAPACK yang sama. Hasilnya identik; perbedaannya ada pada cakupan:
import numpy as np
from scipy import linalg
A = np.array([[2.0, 1.0], [1.0, 3.0]])
b = np.array([5.0, 10.0])
print(linalg.solve(A, b))
print(np.linalg.solve(A, b))
print(linalg.svd(A, compute_uv=False))Output yang Dihasilkan:
[1. 3.]
[1. 3.]
[3.61803399 1.38196601]Bedah singkat:
- Baris 5-7:
linalg.solvedannp.linalg.solvemengembalikan solusi persis sama[1. 3.]untuk sistem yang sama; keduanya menyerahkan pekerjaan ke LAPACK. - Baris 8 (
linalg.svd(A, compute_uv=False)): argumencompute_uv=Falsememinta hanya nilai singular — fitur kenyamanan yang tidak disediakan versi NumPy.
| Aspek | numpy.linalg | scipy.linalg |
|---|---|---|
| Ketersediaan | ikut paket NumPy | perlu memasang SciPy |
| Cakupan fungsi | inti (solve, inv, svd, eig) | superset: lu, qr dengan pivoting, sqrtm, expm |
| Opsi tambahan | lebih sedikit | lebih banyak (mis. compute_uv=False, check_finite) |
| Rekomendasi | kebutuhan harian | butuh dekomposisi atau fungsi khusus |
Kaidahnya sederhana: mulai dari numpy.linalg; pindah ke scipy.linalg ketika fungsi atau opsi yang dibutuhkan tidak ada di sana. Anatomi SVD lengkapnya dibahas pada bab Singular Value Decomposition.
scipy.signal dan scipy.ndimage #
Untuk sinyal satu dimensi, scipy.signal menyediakan konvolusi, penyaringan, dan pengubahan laju sampel. Konvolusi kecil berikut mudah diverifikasi dengan tangan:
import numpy as np
from scipy import signal
a = np.array([1.0, 2.0, 3.0])
kernel = np.array([0.0, 1.0, 0.5])
print(signal.convolve(a, kernel))Output yang Dihasilkan:
[0. 1. 2.5 4. 1.5]Yang dilakukan interpreter:
- Baris 4-5: sinyal tiga sampel dan kernel tiga koefisien disiapkan sebagai ndarray biasa.
- Baris 6 (
signal.convolve(...)): kernel digeser di atas sinyal, tiap posisi dijumlahkan setelah dikali; panjang hasil = 3 + 3 - 1 = 5, danmode="full"adalah bawaannya.
Selain signal, modul scipy.signal.resample mengubah jumlah sampel sinyal lewat transformasi Fourier, dan scipy.ndimage menangani gambar 2-D — zoom, rotate, gaussian_filter — semuanya dengan menerima ndarray dan mengembalikan ndarray. Sisa interoperabilitasnya kembali ke topik bab Array Conversion dan Memory Sharing: mengetahui kapan data berpindah memori dan kapan ia hanya dipinjam.