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:

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

text
2 dari 6 elemen disimpan
[[    0 15000     0]
 [    0     0 20000]]
identik -> True
berbagi memori -> False

Bedah baris demi baris:

  1. Baris 4: array padat (2, 3) berisi data omzet dua cabang, sebagian besar nol.
  2. 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.
  3. Baris 7-8 (m.toarray()): kebalikannya membangun kembali array padat; nilainya identik, tetapi np.shares_memory bernilai False karena 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:

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

text
korelasi : 0.9945194436616309
p-value  : 4.497243830791634e-05
nobs : 6
mean : 73.33333333333333
var  : 110.26666666666664

Penjelasannya:

  1. Baris 5-7 (stats.pearsonr(...)): kedua array 1-D dipakai apa adanya; hasilnya objek PearsonRResult dengan atribut statistic dan pvalue — korelasi 0,9945 menunjukkan hubungan hampir lurus antara jam belajar dan nilai.
  2. Baris 8-11 (stats.describe(...)): objek DescribeResult mengemas nobs, mean, dan variance (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:

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

text
[1. 3.]
[1. 3.]
[3.61803399 1.38196601]

Bedah singkat:

  1. Baris 5-7: linalg.solve dan np.linalg.solve mengembalikan solusi persis sama [1. 3.] untuk sistem yang sama; keduanya menyerahkan pekerjaan ke LAPACK.
  2. Baris 8 (linalg.svd(A, compute_uv=False)): argumen compute_uv=False meminta hanya nilai singular — fitur kenyamanan yang tidak disediakan versi NumPy.
Aspeknumpy.linalgscipy.linalg
Ketersediaanikut paket NumPyperlu memasang SciPy
Cakupan fungsiinti (solve, inv, svd, eig)superset: lu, qr dengan pivoting, sqrtm, expm
Opsi tambahanlebih sedikitlebih banyak (mis. compute_uv=False, check_finite)
Rekomendasikebutuhan harianbutuh 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:

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

text
[0.  1.  2.5 4.  1.5]

Yang dilakukan interpreter:

  1. Baris 4-5: sinyal tiga sampel dan kernel tiga koefisien disiapkan sebagai ndarray biasa.
  2. Baris 6 (signal.convolve(...)): kernel digeser di atas sinyal, tiap posisi dijumlahkan setelah dikali; panjang hasil = 3 + 3 - 1 = 5, dan mode="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.