Istilah penyiaran menjelaskan bagaimana NumPy memperlakukan array dengan bentuk berbeda selama operasi aritmatika. Tunduk pada batasan tertentu, larik yang lebih kecil "disiarkan" ke larik yang lebih besar sehingga mereka memiliki bentuk yang kompatibel. Broadcasting menyediakan cara untuk memvektorisasi operasi array sehingga perulangan terjadi di C alih-alih Python. Ini dilakukan tanpa membuat salinan data yang tidak perlu dan biasanya menghasilkan implementasi algoritme yang efisien. Namun, ada kasus di mana penyiaran adalah ide yang buruk karena menyebabkan penggunaan memori yang tidak efisien sehingga memperlambat perhitungan Show
Operasi NumPy biasanya dilakukan pada pasangan array berdasarkan elemen demi elemen. Dalam kasus yang paling sederhana, kedua larik harus memiliki bentuk yang persis sama, seperti pada contoh berikut >>> a = np.array([1.0, 2.0, 3.0]) >>> b = np.array([2.0, 2.0, 2.0]) >>> a * b array([2., 4., 6.]) Aturan penyiaran NumPy melonggarkan batasan ini ketika bentuk array memenuhi batasan tertentu. Contoh penyiaran paling sederhana terjadi ketika sebuah array dan nilai skalar digabungkan dalam sebuah operasi >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])_ Hasilnya setara dengan contoh sebelumnya di mana >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])2 adalah sebuah array. Kita dapat memikirkan skalar >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])_2 yang diregangkan selama operasi aritmatika menjadi larik dengan bentuk yang sama dengan >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])4. Elemen baru di >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])2, seperti yang ditunjukkan di , hanyalah salinan dari skalar asli. Analogi peregangan hanya bersifat konseptual. NumPy cukup pintar untuk menggunakan nilai skalar asli tanpa benar-benar membuat salinan sehingga operasi penyiaran adalah sebagai memori dan seefisien mungkin secara komputasi Gambar 1 Dalam contoh penyiaran yang paling sederhana, skalar >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])2 direntangkan menjadi larik dengan bentuk yang sama dengan >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])4 sehingga bentuknya kompatibel untuk perkalian elemen demi elemen Kode pada contoh kedua lebih efisien daripada yang pertama karena penyiaran memindahkan lebih sedikit memori selama perkalian ( >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])2 adalah skalar daripada larik) Aturan Penyiaran UmumSaat beroperasi pada dua larik, NumPy membandingkan bentuknya berdasarkan elemen. Ini dimulai dengan trailing (i. e. paling kanan) dimensi dan bekerja dengan cara kiri. Dua dimensi kompatibel saat
Jika kondisi ini tidak terpenuhi, pengecualian >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])_9 dilemparkan, menunjukkan bahwa array memiliki bentuk yang tidak kompatibel Array input tidak perlu memiliki jumlah dimensi yang sama. Array yang dihasilkan akan memiliki jumlah dimensi yang sama dengan array input dengan jumlah dimensi terbesar, di mana ukuran setiap dimensi adalah ukuran terbesar dari dimensi yang sesuai di antara array input. Perhatikan bahwa dimensi yang hilang diasumsikan memiliki ukuran satu Misalnya, jika Anda memiliki Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 3_0 larik nilai RGB, dan Anda ingin menskalakan setiap warna pada gambar dengan nilai yang berbeda, Anda dapat mengalikan gambar dengan larik satu dimensi dengan 3 nilai. Menyejajarkan ukuran sumbu belakang dari larik ini sesuai dengan aturan penyiaran, menunjukkan bahwa keduanya kompatibel Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 3 Ketika salah satu dimensi dibandingkan adalah satu, yang lain digunakan. Dengan kata lain, dimensi dengan ukuran 1 direntangkan atau "disalin" agar sesuai dengan yang lain Dalam contoh berikut, array Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 3_1 dan Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 32 memiliki sumbu dengan panjang satu yang diperluas ke ukuran yang lebih besar selama operasi siaran A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 5 Array yang dapat disiarkanSatu set array disebut "dapat disiarkan" ke bentuk yang sama jika aturan di atas menghasilkan hasil yang valid Misalnya, jika Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 33 adalah (5,1), Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 34 adalah (1,6), Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 35 adalah (6,) dan Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 36 adalah () sehingga d adalah skalar, maka a, b, c, dan d semuanya dapat disiarkan
Berikut beberapa contoh lainnya A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5 Berikut adalah contoh bentuk yang tidak disiarkan A (1d array): 3 B (1d array): 4 # trailing dimensions do not match A (2d array): 2 x 1 B (3d array): 8 x 4 x 3 # second from last dimensions mismatched Contoh penyiaran ketika array 1-d ditambahkan ke array 2-d >>> a = np.array([[ 0.0, 0.0, 0.0], .. [10.0, 10.0, 10.0], .. [20.0, 20.0, 20.0], .. [30.0, 30.0, 30.0]]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a + b array([[ 1., 2., 3.], [11., 12., 13.], [21., 22., 23.], [31., 32., 33.]]) >>> b = np.array([1.0, 2.0, 3.0, 4.0]) >>> a + b Traceback (most recent call last): ValueError: operands could not be broadcast together with shapes (4,3) (4,) Seperti yang ditunjukkan pada , >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])_2 ditambahkan ke setiap baris >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])4. Di , pengecualian dimunculkan karena bentuk yang tidak kompatibel Gambar 2 Array satu dimensi yang ditambahkan ke array dua dimensi menghasilkan penyiaran jika jumlah elemen array 1-d cocok dengan jumlah kolom array 2-d Gambar 3 Ketika dimensi akhir dari larik tidak sama, penyiaran gagal karena tidak mungkin menyelaraskan nilai di baris larik pertama dengan elemen larik ke-2 untuk penambahan elemen demi elemen Penyiaran menyediakan cara yang nyaman untuk mengambil produk luar (atau operasi luar lainnya) dari dua larik. Contoh berikut menunjukkan operasi penjumlahan luar dari dua larik 1-d >>> a = np.array([0.0, 10.0, 20.0, 30.0]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a[:, np.newaxis] + b array([[ 1., 2., 3.], [11., 12., 13.], [21., 22., 23.], [31., 32., 33.]]) Gambar 4 Dalam beberapa kasus, penyiaran merentangkan kedua larik untuk membentuk larik keluaran yang lebih besar dari salah satu larik awal Di sini operator indeks A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 5_2 menyisipkan sumbu baru ke dalam >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])4, menjadikannya larik A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 54 dua dimensi. Menggabungkan larik A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 54 dengan >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])2, yang berbentuk A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 57, menghasilkan larik A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 58 Contoh Praktis. Kuantisasi VektorPenyiaran muncul cukup sering dalam masalah dunia nyata. Contoh tipikal terjadi pada algoritma kuantisasi vektor (VQ) yang digunakan dalam teori informasi, klasifikasi, dan area terkait lainnya. Operasi dasar dalam VQ menemukan titik terdekat dalam sekumpulan titik, disebut A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 59 dalam jargon VQ, ke titik tertentu, disebut A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 50. Dalam kasus dua dimensi yang sangat sederhana yang ditunjukkan di bawah ini, nilai dalam A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 50 menggambarkan berat dan tinggi seorang atlet yang akan diklasifikasikan. A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 5_9 mewakili kelas atlet yang berbeda. Menemukan titik terdekat membutuhkan penghitungan jarak antara observasi dan masing-masing kode. Jarak terpendek memberikan kecocokan terbaik. Dalam contoh ini, A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5_3 adalah kelas terdekat yang menunjukkan bahwa atlet kemungkinan adalah pemain bola basket >>> from numpy import array, argmin, sqrt, sum >>> observation = array([111.0, 188.0]) >>> codes = array([[102.0, 203.0], .. [132.0, 193.0], .. [45.0, 155.0], .. [57.0, 173.0]]) >>> diff = codes - observation # the broadcast happens here >>> dist = sqrt(sum(diff**2,axis=-1)) >>> argmin(dist) 0 Dalam contoh ini, larik A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5_0 direntangkan agar sesuai dengan bentuk larik A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 59 Observation (1d array): 2 Codes (2d array): 4 x 2 Diff (2d array): 4 x 2 Gambar 5 Operasi dasar kuantisasi vektor menghitung jarak antara objek yang akan diklasifikasikan, kotak gelap, dan beberapa kode yang diketahui, lingkaran abu-abu. Dalam kasus sederhana ini, kode mewakili kelas individu. Kasus yang lebih kompleks menggunakan banyak kode per kelas Biasanya, sejumlah besar A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5_6, mungkin dibaca dari database, dibandingkan dengan sekumpulan A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 59. Pertimbangkan skenario ini >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([2., 4., 6.])_0 Array tiga dimensi, A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5_8, adalah konsekuensi dari penyiaran, bukan keharusan untuk perhitungan. Kumpulan data besar akan menghasilkan larik menengah besar yang secara komputasi tidak efisien. Sebagai gantinya, jika setiap pengamatan dihitung secara individual menggunakan loop Python di sekitar kode dalam contoh dua dimensi di atas, array yang jauh lebih kecil digunakan Broadcasting adalah alat yang ampuh untuk menulis kode pendek dan biasanya intuitif yang melakukan perhitungannya dengan sangat efisien di C. Namun, ada kasus ketika penyiaran menggunakan memori dalam jumlah besar yang tidak perlu untuk algoritme tertentu. Dalam kasus ini, lebih baik menulis loop luar algoritme dengan Python. Ini juga dapat menghasilkan kode yang lebih mudah dibaca, karena algoritme yang menggunakan penyiaran cenderung menjadi lebih sulit untuk ditafsirkan karena jumlah dimensi dalam siaran meningkat. Catatan kaki []Dalam contoh ini, bobot lebih berdampak pada penghitungan jarak daripada tinggi karena nilai yang lebih besar. Dalam praktiknya, penting untuk menormalkan tinggi dan berat badan, seringkali dengan deviasi standarnya di seluruh kumpulan data, sehingga keduanya memiliki pengaruh yang sama pada perhitungan jarak. Bagaimana cara mengubah array menjadi gambar dengan Python?NumPy dapat digunakan untuk mengubah array menjadi gambar. . Buat array numpy Bentuk ulang larik di atas ke dimensi yang sesuai Buat objek gambar dari larik di atas menggunakan pustaka PIL Simpan objek gambar dalam format file yang sesuai Bagaimana Anda mengonversi gambar ke mode warna RGB dengan python?Kita dapat menggunakan metode cvtColor() untuk mengonversi gambar BGR ke RGB dan sebaliknya. Parameter. cv2. COLOR_BGR2RGB – gambar BGR dikonversi ke RGB.
Bagaimana cara mengonversi gambar ke array rgb?Konversi gambar menjadi larik . Impor gambar menggunakan scipy. . Siapkan peta warna menggunakan matplotlib. . Kueri peta warna dengan banyak angka di sepanjang interval yang telah Anda tentukan dan simpan di KDTree Kueri KDTree menggunakan larik RGB ndimage m × n × 3. . Kurangi data dengan mengambil turunan spasial pertama menggunakan numpy Bagaimana Anda membentuk kembali array 1d menjadi 2D dengan Python?Gunakan Fungsi reshape() untuk Mengubah Array 1d menjadi Array 2d
. Kami dapat menambah atau menghapus parameter atau menyesuaikan jumlah item dalam setiap dimensi dengan menggunakan pembentukan ulang. Untuk mengubah tata letak NumPy ndarray, kita akan menggunakan metode reshape(). |