Operasi array yang paling sering ditulis hanyalah array berjumpa satu angka: menaikkan seluruh harga sepuluh persen, mengonversi seluruh suhu ke Fahrenheit, atau mengurangi seluruh stok satu unit. NumPy memperlakukan angka tunggal itu sebagai scalar — array tanpa dimensi berbentuk () — dan aturan broadcasting memastikan scalar cocok dengan bentuk apa pun.
Bab ini menuntaskan tiga pertanyaan:
- Bagaimana bentuk dan dtype hasil ketika array dikalikan scalar?
- Mengapa bentuk
()kompatibel dengan semua bentuk? - Apakah operasi dengan scalar menyalin data?
Mengalikan seluruh array dengan satu angka #
Kenaikan harga sepuluh persen berarti mengalikan tiap harga dengan 1.1:
import numpy as np
harga = np.array([10000, 15000, 20000, 25000])
hasil = harga * 1.1
print(hasil)
print(hasil.dtype)Output yang Dihasilkan:
[11000. 16500. 22000. 27500.]
float64- Baris 3 (
harga): array(4,)dengan dtypeint64karena seluruh elemennya bilangan bulat. - Baris 4 (
harga * 1.1): scalar1.1diperlakukan sebagai array berbentuk(); perkalian berjalan per elemen dan menghasilkan array baru. - Baris 6-7: hasil memakai
float64— NumPy mempromosikanint64lawanfloat64Python menjadifloat64, sehingga nilai pecahan hasil kenaikan sepuluh persen tetap tersimpan utuh.
Scalar adalah array berbentuk () #
Scalar Python biasa punya ndim nol dan bentuk tupel kosong. Kita periksa langsung, lalu uji dengan np.broadcast_shapes:
import numpy as np
print(np.ndim(1.1))
print(np.shape(1.1))
print(np.broadcast_shapes((3, 4), ()))
print(np.broadcast_shapes((), (7,)))
print(np.shape(np.float64(2.5)))Output yang Dihasilkan:
0
()
(3, 4)
(7,)
()- Baris 3-4:
1.1memiliki nol dimensi dan bentuk()— sebuah tupel kosong, bukan(1,)maupun(0,). - Baris 5-6:
()berpasangan dengan(3, 4)menghasilkan(3, 4); berpasangan dengan(7,)menghasilkan(7,). Bentuk hasil selalu mengikuti bentuk pasangannya. - Baris 7 (
np.float64(2.5)): scalar yang membungkus nilai NumPy pun berbentuk()— perlakuan broadcasting identik.
Alasan kompatibilitasnya sederhana: aturan kedua broadcasting memeriksa pasangan dimensi, sedangkan bentuk () tidak memiliki satu pun dimensi untuk diperiksa. Tanpa pasangan yang bisa gagal, scalar lolos terhadap bentuk apa pun.
Memori: scalar disimpan satu kali #
Satu pertanyaan wajar: apakah a + 5.0 membuat array perantara berisi lima berulang? Kita ukur nbytes hasilnya:
import numpy as np
a = np.zeros(3)
b = a + 5.0
print(a.nbytes, b.nbytes)
print(np.broadcast_shapes(a.shape, ()))Output yang Dihasilkan:
24 24
(3,)- Baris 4-5 (
b = a + 5.0): operasi menghasilkan array baru(3,). - Baris 7:
adanbsama-sama 24 byte. Scalar5.0disimpan di satu lokasi memori dan dibaca ulang NumPy pada setiap langkah perhitungan — tidak ada array perantara berisi lima berulang. - Baris 8: bentuk hasil
(3,)menegaskan kembali aturan bentuk hasil pada bab sebelumnya.
Ketika array berisi satu juta elemen dijumlahkan dengan 5.0, yang terjadi adalah satu juta kali pembacaan nilai 5.0 yang sama, bukan penyalinan satu juta angka lima.
Hati-hati dengan makna * pada list Python #
Tabel berikut merangkum perilaku operasi scalar:
| Ekspresi | Bentuk hasil | Catatan |
|---|---|---|
harga * 1.1 | sama dengan bentuk harga | dtype mengikuti aturan promosi tipe |
matriks + 10 | sama dengan bentuk matriks | scalar cocok dengan ndim berapa pun |
np.broadcast_shapes((), (7,)) | (7,) | bentuk () selalu mengikuti pasangannya |