Vektorisasi dan Penyiaran dengan Python

Diterbitkan: 2020-12-01

Vektorisasi dan Penyiaran adalah cara untuk mempercepat waktu komputasi dan mengoptimalkan penggunaan memori saat melakukan operasi matematika dengan Numpy. Metode ini sangat penting untuk memastikan kompleksitas waktu berkurang sehingga algoritme tidak menghadapi hambatan apa pun. Operasi yang dioptimalkan ini diperlukan agar aplikasi dapat diskalakan. Kami akan membahas kedua teknik ini dan menerapkan beberapa contoh.

Pada akhir tutorial ini, Anda akan memiliki pengetahuan berikut:

  • Bagaimana Vektorisasi ditangani oleh Numpy
  • Perbedaan waktu dengan dan tanpa Vektorisasi
  • Apa itu Penyiaran?
  • Bagaimana Penyiaran berbeda dari perkalian Matriks biasa

Vektorisasi

Seringkali kita membutuhkan operasi matematika pada array – seperti perkalian array. Sekarang, cara yang tidak divektorkan adalah melakukan perkalian elemen dengan menggunakan loop. Menerapkannya sedemikian rupa akan menghasilkan operasi perkalian yang sama yang harus dilakukan beberapa kali yang akan membuang-buang sumber daya komputasi jika ukuran data terlalu besar. Mari kita lihat sekilas.

Cara non-vektor:

Impor acak

a = [random.randint( 1 , 100 ) untuk _ dalam rentang( 10000 )]
b = [random.randint( 1 , 100 ) untuk _ dalam rentang( 10000 )]
%timeit [i*j untuk i, j dalam zip(a,b)]

#Keluaran:
>> 1000 loop, terbaik dari 3 : 658 s per loop

Cara vektor:

impor numpy sebagai np
a = np.array([random.randint( 1 , 100 ) untuk _ dalam rentang( 10000 )])
b = np.array([random.randint( 1 , 100 ) untuk _ dalam rentang( 10000 )])
%waktu a*b

#Keluaran:
>> 100000 loop, terbaik dari 3 : 7,25 s per loop

Seperti yang kita lihat, waktu berlalu dari 658 mikrodetik menjadi hanya 7,25 mikrodetik. Ini karena ketika kita mengatakan a = np.array([]) , semua operasi ditangani secara internal oleh numpy. Dan ketika kita melakukan a*b , numpy secara internal mengalikan array lengkap sekaligus dengan cara vektorisasi.

Di sini kami menggunakan perintah ajaib %timeit untuk menghitung waktu eksekusi proses yang mungkin berbeda pada mesin Anda.

Mari kita lihat contoh lain dari produk luar dari 2 vektor dengan dimensi (nx1) dan (1xm). Outputnya adalah (nxm).

waktu impor
impor numpy
impor larik
a = array.array( 'i' , [random.randint( 1 , 100 ) untuk _ dalam rentang( 100 )])
b = array.array( 'i' , [random.randint( 1 , 100 ) untuk _ dalam rentang( 100 )])

T1 = waktu.proses_waktu()
c = numpy.zeros(( 200 , 200 ))

untuk saya dalam jangkauan(len(a)):
untuk j dalam rentang(len(b)):
c[i][j]= a[i]*b[j]

T2 = waktu.proses_waktu()

print( f”Waktu komputasi = { 1000 *(T2-T1)} ms” )

#Keluaran:
>> Waktu komputasi = 6.819299000000001 ms

Sekarang, mari kita lakukan dengan Numpy,

T1 = waktu.proses_waktu()
c = numpy.luar(a, b)
T2 = waktu.proses_waktu()

print( f”Waktu komputasi = { 1000 *(T2-T1)} ms” )

#Keluaran:
>> Waktu komputasi = 0.2256630000001536 ms

Seperti yang kita lihat lagi, Numpy memproses cara operasi yang sama lebih cepat dengan vektorisasi.

Wajib Dibaca: Aplikasi Python yang Menarik di Dunia Nyata

Penyiaran

Jadi sampai sekarang, kami melihat contoh di mana array dengan ukuran yang sama digunakan. Bagaimana jika ukuran array berbeda? Di sinilah fitur hebat Numpy lainnya, Penyiaran, muncul.

Penyiaran adalah ekstensi lain untuk vektorisasi di mana array tidak perlu memiliki ukuran yang sama untuk operasi yang akan dilakukan pada mereka seperti penambahan, pengurangan, perkalian, dll Mari kita memahami ini dengan contoh yang sangat sederhana dari penambahan array dan skalar.

a = np.array([ 1 , 1 , 1 , 1 ])
a+ 5

#Keluaran:
larik([ 6 , 6 , 6 , 6 ])

Seperti yang kita lihat, skalar 5 ditambahkan ke semua elemen. Jadi bagaimana itu terjadi?

Untuk membayangkan prosesnya, Anda dapat berpikir bahwa skalar 5 diulang 4 kali untuk membuat array yang kemudian ditambahkan ke dalam array a. Namun perlu diingat, Numpy tidak membuat array seperti itu yang hanya akan memakan memori. Numpy hanya "menyiarkan" atau menggandakan skalar 5 hingga 4 tempat untuk menambahkannya ke array a.

Mari kita ambil contoh mudah lainnya.

a = np.satu(( 3 , 3 ))
b = np.satu( 3 )
a+b

#Keluaran:
>> array([[ 2. , 2. , 2. ],
[ 2. , 2. , 2. ],
[ 2. , 2. , 2. ]])

Dalam contoh di atas, larik bentuk (3,1) disiarkan ke (3,3) untuk mencocokkan larik a.

Tetapi apakah ini berarti bahwa larik apa pun dengan dimensi apa pun dapat disiarkan untuk mencocokkan larik dengan dimensi apa pun?

TIDAK!

Aturan penyiaran

Numpy mengikuti seperangkat aturan mudah untuk memastikan hanya array yang mengikuti kriteria yang disiarkan. Mari lihat.

Aturan penyiaran mengatakan bahwa 2 array yang akan dioperasikan harus memiliki dimensi yang sama atau jika salah satunya adalah 1.

Mari kita lihat ini beraksi.

Contoh 1:

Pertimbangkan array dimensi di bawah ini:

a = 3 x 4 x 7

b = 3 x 4 x 1

Di sini dimensi terakhir b akan disiarkan agar sesuai dengan a hingga 7.

Jadi, hasil = 3 x 4 x 7

Contoh 2:

a = 3 x 4 x 7

b = 4

Sekarang, jumlah dimensi a dan b tidak sama. Dalam kasus seperti itu, array dengan jumlah dimensi yang lebih sedikit akan diisi dengan 1.

Jadi, di sini, dimensi pertama dan terakhir b adalah 1, jadi mereka akan disiarkan untuk mencocokkan a ke 3 dan 7.

Jadi, hasil = 3 x 4 x 7.

Baca: Tutorial Python

Contoh 3:

a = 3 x 4 x 1 x 5

b = 3 x 1 x 7 x 1

Di sini, sekali lagi, dimensi kedua dan terakhir b akan disiarkan agar sesuai dengan a hingga 4 dan 5. Selain itu, dimensi ketiga a akan disiarkan untuk mencocokkan dengan b hingga 7.

Jadi, hasil = 3 x 4 x 7 x 5

Sekarang mari kita lihat ketika kondisi gagal:

Contoh 4:

a = 3 x 4 x 7 x 5

b = 3 x 3 x 7 x 4

Di sini, dimensi kedua dan keempat dari b tidak cocok dengan a dan juga tidak 1. Dalam hal ini, Python akan melempar kesalahan nilai:

ValueError: operan tidak dapat disiarkan bersama dengan bentuk ( 3 , 4 , 7 , 5 ) ( 3 , 3 , 7 , 4 )

Contoh 5:

a = 3 x 4 x 1 x 5

b = 3 x 2 x 3

Hasil: ValueError

Di sini juga, dimensi kedua tidak cocok dan bukan 1 untuk keduanya.

Sebelum kamu pergi

Vektorisasi dan Penyiaran, keduanya, adalah metode bagaimana Numpy membuat pemrosesannya dioptimalkan dan lebih efisien. Konsep-konsep ini harus diingat terutama ketika berhadapan dengan matriks dan array n-dimensi, yang sangat umum dalam data gambar dan Neural Networks.

Jika Anda penasaran untuk belajar tentang python, ilmu data, lihat PG Diploma IIIT-B & upGrad dalam Ilmu Data yang dibuat untuk para profesional yang bekerja dan menawarkan 10+ studi kasus & proyek, lokakarya praktis, bimbingan dengan pakar industri, 1-on-1 dengan mentor industri, 400+ jam pembelajaran dan bantuan pekerjaan dengan perusahaan-perusahaan top.

Apa itu Vektorisasi dengan Python?

Numpy adalah paket Python yang menyediakan beberapa fungsi matematika standar yang memungkinkan operasi cepat pada array data yang besar tanpa perlu loop, termasuk Vektorisasi. Vektorisasi digunakan untuk mempercepat program Python tanpa menggunakan loop. Menggunakan metode seperti itu dapat membantu mengurangi jumlah waktu yang dibutuhkan kode untuk dieksekusi. Ada berbagai operasi yang dilakukan pada vektor, seperti produk titik vektor, juga dikenal sebagai produk skalar karena menghasilkan output tunggal, produk luar, yang menghasilkan matriks persegi berdimensi sama dengan panjang x panjang vektor, perkalian elemen, yang menghasilkan elemen dengan indeks yang sama.

Apa itu Penyiaran dengan Python?

Kata broadcasting mengacu pada bagaimana Numpy mengelola array dengan Dimensi yang berbeda selama operasi aritmatika yang menghasilkan pembatasan tertentu; array yang lebih kecil disiarkan ke array yang sangat besar sehingga bentuknya konsisten. Broadcasting memungkinkan Anda untuk membuat vektorisasi operasi array sedemikian rupa sehingga perulangan terjadi di C daripada Python, seperti yang dilakukan Numpy. Ini menyelesaikan ini tanpa membuat salinan data yang tidak perlu, menghasilkan implementasi algoritma yang efisien. Dalam situasi tertentu, penyiaran adalah ide negatif karena menghasilkan konsumsi memori yang boros, yang memperlambat pemrosesan.

Apa kegunaan NumPy di ​​Python?

NumPy atau Numerical Python adalah pustaka Python sumber terbuka dan gratis yang digunakan oleh hampir setiap cabang penelitian dan teknik. Pustaka NumPy mencakup array multidimensi dan struktur data matriks dan menawarkan metode untuk beroperasi secara efisien pada array, objek array n-dimensi yang homogen. Pengguna dapat menggunakan NumPy untuk menjalankan berbagai operasi matematika pada array. Ini meningkatkan Python dengan struktur data yang kuat yang menyediakan komputasi efisien dengan array dan matriks, serta perpustakaan besar fungsi matematika tingkat tinggi yang bekerja pada array dan matriks.