import numpy as np
temperatur = np.array(
[[28.0, 29.5, 30.0], [27.5, 29.0, 31.0]],
dtype=np.float64,
)
(temperatur.shape, temperatur.ndim, temperatur.dtype)((2, 3), 2, dtype('float64'))
Setelah menyelesaikan unit ini, pembaca dapat:
dtype yang dinyatakan;Prasyarat lokal: Unit 1-2, fungsi linear sederhana, daftar dan tuple, serta koordinat pada bidang. Unit ini tidak mengandaikan kalkulus atau aljabar linear formal.
Array bukan sekadar kumpulan angka. Kontrak minimalnya memuat:
shape), yaitu banyaknya posisi pada setiap sumbu;ndim);dtype); danimport numpy as np
temperatur = np.array(
[[28.0, 29.5, 30.0], [27.5, 29.0, 31.0]],
dtype=np.float64,
)
(temperatur.shape, temperatur.ndim, temperatur.dtype)((2, 3), 2, dtype('float64'))
Bentuk (2, 3) hanya mengatakan bahwa ada dua baris dan tiga kolom. Bentuk itu belum mengatakan apakah baris menyatakan kota, hari, atau pengulangan percobaan. Makna tersebut merupakan bagian dari spesifikasi data.
Array satu dimensi dengan bentuk (3,) berbeda dari tabel satu baris berbentuk (1, 3) dan tabel satu kolom berbentuk (3, 1). Ketiganya memuat tiga angka, tetapi operasi terhadap sumbunya dapat berbeda.
dtype adalah representasi, bukan himpunan matematikaNumPy menyimpan elemen array biasa dalam satu dtype. Pilihan eksplisit membuat kontrak lebih mudah diperiksa:
bilangan_bulat = np.array([1, 2, 3], dtype=np.int64)
pendekatan = np.array([0.1, 0.2, 0.3], dtype=np.float64)
(bilangan_bulat.dtype, pendekatan.dtype, pendekatan.sum())(dtype('int64'), dtype('float64'), np.float64(0.6000000000000001))
int64 menyimpan bilangan bulat dalam rentang berhingga. Operasi yang keluar dari rentang itu dapat meluap; ia tidak sama dengan himpunan seluruh bilangan bulat matematika. float64 menyimpan pendekatan biner dengan ketelitian berhingga; ia tidak sama dengan bilangan real.
NumPy dapat memakai dtype=object untuk objek Python seperti bilangan bulat tak berbatas praktis atau Fraction, tetapi banyak keuntungan komputasi array numerik hilang. Jika pertanyaan menuntut aritmetika eksak, pilih alat eksak secara sadar (misalnya Fraction, SymPy, atau Sage), alih-alih menyebut hasil float64 eksak.
Misalkan setiap data diubah oleh fungsi
Perulangan skalar yang jelas dapat menjadi referensi:
x = np.array([1, 2, 3, 4], dtype=np.int64)
y_referensi = np.array([3 * int(nilai) - 2 for nilai in x])
y_referensiarray([ 1, 4, 7, 10])
NumPy memungkinkan aturan yang sama ditulis untuk seluruh array:
y = 3 * x - 2
yarray([ 1, 4, 7, 10])
Vektorisasi menyatakan operasi pada array tanpa perulangan Python yang kita tulis sendiri. Ia sering lebih ringkas dan dapat lebih cepat, tetapi keringkasan bukan bukti kebenaran. Bandingkan hasilnya dengan referensi sederhana dan periksa invarian yang berasal dari rumus:
y.shape == x.shape;x tidak berubah; danReferensi skalar juga harus diperiksa. Dua implementasi yang menyalin kesalahan konseptual sama dapat sepakat dan tetap salah.
Broadcasting memperluas operasi antararray tanpa membuat salinan ubin secara manual. Misalkan setiap kolom tabel menerima offset berbeda:
tabel = np.array([[10, 20, 30], [40, 50, 60]], dtype=np.int64)
offset = np.array([1, -2, 3], dtype=np.int64)
tabel + offsetarray([[11, 18, 33],
[41, 48, 63]])
Bentuk (2, 3) dan (3,) cocok karena sumbu terakhir sama-sama berukuran tiga. Offset diterapkan pada setiap baris. Jangan mengandalkan keberhasilan operasi sebagai satu-satunya pemeriksaan: bentuk yang tidak dimaksudkan kadang tetap dapat di-broadcast dan menghasilkan jawaban yang tampak masuk akal.
Fungsi add_column_offsets dalam kode Unit 3 menyatakan kontrak lebih ketat: tabel harus dua dimensi, offset harus satu dimensi, dan jumlah offset harus sama dengan jumlah kolom.
Irisan array NumPy biasanya merupakan view: objek baru yang melihat memori array asal. Mengubah view dapat mengubah data asal.
asal = np.arange(6)
jendela = asal[1:4]
jendela[0] = -10
asalarray([ 0, -10, 2, 3, 4, 5])
Gunakan .copy() bila eksperimen membutuhkan nilai terpisah:
asal = np.arange(6)
terpisah = asal[1:4].copy()
terpisah[0] = -10
asalarray([0, 1, 2, 3, 4, 5])
Pilihan ini harus disengaja. View berguna untuk menghindari salinan besar; salinan berguna untuk mencegah perubahan tak terduga. np.shares_memory(a, b) dapat membantu memeriksa hubungan itu pada tes.
Jalankan dari akar proyek:
python source/code/unit03_arrays.py --output output/unit03-results.json
Skrip mencatat versi NumPy, bentuk, dtype, hasil vektorisasi, hasil broadcasting, jejak view dan salinan, batas titik-mengambang, serta batas epistemik kesimpulan. JSON ditulis sebagai UTF-8 dengan kunci terurut, inden tetap, dan akhir baris LF. Pada lingkungan yang sama, pemanggilan yang sama menghasilkan byte yang sama.
Untuk array [1, 2, 3, 4], program memeriksa bahwa operasi vektorisasi sama dengan referensi skalar. Hasil itu mendukung klaim terbatas tentang kasus dan implementasi yang dijalankan. Ia tidak membuktikan kesamaan bagi setiap array, setiap dtype, atau setiap ukuran.
Untuk aritmetika tanpa luapan, argumen umum berjalan per komponen. Pada indeks , kedua implementasi menghitung ekspresi yang sama, yaitu . Karena indeks dipilih sembarang, kesamaan berlaku pada setiap komponen; bentuk juga tetap karena tepat satu keluaran dibuat untuk setiap masukan.
Argumen itu harus dibatasi oleh domain representasi. Pada int64, luapan dapat mengubah hubungan dengan bilangan bulat matematika. Pada float64, pembulatan dapat membuat dua susunan operasi yang ekuivalen secara aljabar menghasilkan bit berbeda. Tes membantu menemukan gejala tersebut; spesifikasi dan argumen menentukan apa yang sebenarnya diklaim.
Sebuah array menyimpan pengukuran tiga sensor pada empat waktu dan mempunyai bentuk (4, 3). Jelaskan arti kedua sumbu. Apa bentuk yang dihasilkan oleh data[2, :] dan data[:, 1]?
Indeks tunggal menghapus sumbu yang dipilih, sedangkan : mempertahankan semua posisi pada sumbu itu.
Sumbu 0 menyatakan empat waktu dan sumbu 1 menyatakan tiga sensor. data[2, :] memilih seluruh sensor pada waktu ketiga sehingga berbentuk (3,). data[:, 1] memilih sensor kedua pada seluruh waktu sehingga berbentuk (4,). Makna ini berasal dari kontrak data, bukan dari bentuk saja.
Vektorisasikan perulangan yang menghitung . Sebutkan dua invarian yang dapat diuji dan turunkan invarian jumlahnya.
Terapkan operasi langsung pada x, lalu jumlahkan persamaan komponen.
Tuliskan z = 5*x + 1. Dua invarian yang berguna ialah z.shape == x.shape dan x tidak berubah. Jika ada elemen, maka
Tes dapat membandingkan hasil vektorisasi dengan referensi skalar serta memeriksa ketiga sifat tersebut pada kasus yang dipilih.
Tentukan apakah pasangan bentuk berikut cocok untuk penambahan yang dimaksudkan sebagai “satu offset per kolom”: (5, 3) dengan (3,), (5, 3) dengan (5,), dan (5, 3) dengan (1, 3). Jelaskan setiap jawaban.
Bandingkan dimensi dari kanan. Ukuran harus sama atau salah satunya satu.
(5, 3) dengan (3,) cocok dan menerapkan tiga offset pada setiap baris. (5, 3) dengan (5,) tidak cocok karena ukuran terakhir 3 dan 5 berbeda. (5, 3) dengan (1, 3) cocok; sumbu pertama berukuran satu diperluas menjadi lima. Meskipun dua pasangan cocok menurut NumPy, kontrak fungsi tetap perlu menyatakan bahwa data kedua benar-benar berarti offset kolom.
Untuk kode berikut, tentukan nilai akhir a, b, dan c tanpa menjalankannya.
a = np.array([0, 1, 2, 3])
b = a[1:3]
c = a[1:3].copy()
b[0] = 8
c[1] = 9b berbagi memori dengan a, sedangkan c tidak.
Nilai akhirnya adalah a == [0, 8, 2, 3], b == [8, 2], dan c == [1, 9]. Perubahan melalui b mengenai elemen yang sama pada a. Salinan c dibuat sebelum perubahan dan perubahan pada c tidak kembali ke a.
Anda membangkitkan satu juta array bilangan kecil dan mendapati bahwa 3*x-2 selalu sama dengan referensi perulangan. Nyatakan kesimpulan terkuat yang sah, lalu berikan kerangka bukti umum dan satu batas representasinya.
Pisahkan cakupan sampel, argumen per komponen, dan perilaku dtype berhingga.
Kesimpulan empiris terkuat ialah tidak ditemukan perbedaan pada satu juta kasus dan lingkungan yang diuji. Untuk bukti umum pada domain aritmetika yang ditetapkan, pilih indeks sembarang : kedua cara menghitung , sehingga semua komponennya sama dan bentuknya tetap. Batasnya, int64 dapat meluap dan float64 membulatkan; karena itu hubungan dengan aritmetika bilangan bulat atau real harus menyebut rentang dan model representasi.
shape, ndim, dtype, dan makna sumbu bersama-sama membentuk kontrak array..copy() memutus hubungan memori.dtype harus menjadi bagian dari klaim.