Bentuk hasil broadcasting
Diberikan dua bentuk (shape) array a dan b sebagai list bilangan bulat. Kembalikan bentuk hasil A + B menurut aturan broadcasting NumPy, atau None jika keduanya tidak kompatibel.
Jangan pakai np.broadcast_shapes: tujuan soal ini adalah menuliskan aturannya sendiri.
[3, 1] dan [1, 4] → [3, 4]
[2, 3] dan [3] → [2, 3]
[2, 3] dan [2] → None // 3 vs 2, tidak ada yang bernilai 1
| dimensi (dari kanan) | A | B | hasil | aturan |
|---|---|---|---|---|
| axis -4 | 8 | · | 8 | dimensi tidak ada → dianggap 1 |
| axis -3 | 1 | 7 | 7 | salah satu 1 → direntangkan |
| axis -2 | 6 | 1 | 6 | salah satu 1 → direntangkan |
| axis -1 | 1 | 5 | 5 | salah satu 1 → direntangkan |
A + B → shape (8, 7, 6, 5)
Rata kanan, lalu cek tiap dimensi: harus sama, atau salah satunya 1 (atau tidak ada). Dimensi berukuran 1 "direntangkan" tanpa menyalin data.
Kenapa broadcasting penting
Hampir setiap baris kode ML memakai broadcasting: menambahkan bias (d,) ke batch (N, d), mengurangi rata-rata per kolom, membagi dengan norma per baris. Bug yang paling sering muncul adalah broadcasting yang diam-diam berhasil dengan bentuk yang salah, misalnya (N,) + (N, 1) menjadi (N, N).
Aturannya
- Sejajarkan kedua bentuk dari kanan.
- Tambahkan 1 di kiri bentuk yang lebih pendek.
- Untuk tiap posisi: kalau sama, pakai itu; kalau salah satunya 1, pakai yang lain; selain itu error.
Dimensi bernilai 1 “direntangkan” tanpa menyalin data. Itulah kenapa broadcasting cepat dan hemat memori.
Penjelasan
Yang diminta. Kita tidak menghitung angka apa pun, hanya bentuk hasil A + B. Inputnya dua list (misalnya [3, 1] dan [1, 4]), outputnya list bentuk hasil, atau None kalau NumPy akan melempar error.
Kenapa dari kanan. NumPy menyejajarkan bentuk dari dimensi terakhir. (2, 3) dan (3,) cocok karena 3 di ujung kanan bertemu 3. Dimensi yang “tidak ada” di bentuk yang lebih pendek dianggap 1.
Langkah di kode:
for i in range(1, max(len(a), len(b)) + 1)berjalan dari posisi-1(paling kanan) sampai posisi paling kiri bentuk yang lebih panjang.x = a[-i] if i <= len(a) else 1membaca dimensiadi posisi itu, atau1jikaasudah habis. Sama untuky.- Jika
x != ydan tidak ada yang bernilai 1, bentuknya tidak kompatibel, jadireturn None. - Dimensi hasilnya adalah yang bukan 1:
x if y == 1 else y. Ditulis begini (bukanmax(x, y)) supaya kasus0vs1benar: hasilnya0, bukan1. - Hasil dikumpulkan dari kanan ke kiri, jadi dibalik dengan
out[::-1]sebelum dikembalikan.
Yang dikembalikan: list bilangan bulat (bentuk hasil), atau None.
Kesalahan umum: membandingkan dari kiri; lupa membalik hasil; memakai max sehingga dimensi 0 rusak.
Topik
Petunjuk 1
Bandingkan dimensi dari kanan ke kiri. Kalau salah satu bentuk lebih pendek, anggap dimensi yang hilang bernilai 1.
Petunjuk 2
Dua dimensi cocok jika sama, atau salah satunya 1. Hasilnya adalah dimensi yang bukan 1.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.