Lewati ke konten utama

Tutorial Scipy: Vektor dan Array (Aljabar Linear)

Tutorial SciPy di mana Anda akan mempelajari dasar-dasar aljabar linear yang Anda butuhkan untuk machine learning di Python, dengan fokus cara melakukannya dengan NumPy.
Diperbarui 28 Sep 2026  · 15 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Banyak hal yang perlu Anda ketahui untuk benar-benar menyelami machine learning adalah aljabar linear, dan itulah yang dibahas tutorial ini. Postingan hari ini membahas topik-topik aljabar linear yang perlu Anda ketahui dan pahami untuk meningkatkan intuisi tentang bagaimana dan kapan metode machine learning bekerja dengan melihat pada tingkat vektor dan matriks.

Pada akhir tutorial, semoga Anda merasa lebih percaya diri untuk meninjau algoritme lebih dekat!

Isi


Pendahuluan

Salah satu dari tiga topik dasar yang perlu Anda kuasai jika ingin belajar data science adalah machine learning. Dan ketika Anda benar-benar mendalami machine learning, penting untuk menggali lebih dalam dan membangun intuisi serta pemahaman tentang cara kerja algoritme.

Dan saya pikir Anda, calon atau praktisi data scientist, mungkin setuju bahwa mencapai titik ini bisa jadi pekerjaan yang menantang.

Tapi tidak harus begitu.

SciPy versus NumPy

Dari tutorial NumPy DataCamp, Anda akan mengetahui bahwa pustaka ini adalah salah satu pustaka inti untuk komputasi ilmiah di Python. Pustaka ini berisi kumpulan alat dan teknik yang dapat digunakan untuk menyelesaikan di komputer model matematis dari masalah di Sains dan Teknik. Namun, alat yang paling sering Anda gunakan adalah objek array multidimensi berkinerja tinggi: ini adalah struktur data yang kuat yang memungkinkan Anda menghitung array dan matriks secara efisien.

Sekarang, SciPy pada dasarnya adalah NumPy.

Ini juga merupakan salah satu paket inti untuk komputasi ilmiah yang menyediakan algoritme matematika dan fungsi kemudahan, tetapi dibangun di atas ekstensi NumPy untuk Python. Ini berarti SciPy dan NumPy sering digunakan bersama!

Nanti di tutorial ini, Anda akan melihat bagaimana kolaborasi antara kedua pustaka ini menjadi hal yang sudah sewajarnya.

Berinteraksi dengan NumPy dan SciPy

Untuk berinteraksi secara efisien dengan kedua paket, Anda pertama-tama perlu mengetahui beberapa dasar dari pustaka ini dan struktur data yang kuat. Untuk bekerja dengan array ini, ada banyak fungsi matematis tingkat tinggi yang beroperasi pada matriks dan array ini.

Pada bagian berikut, Anda akan mendapatkan gambaran singkat tentang topik-topik yang perlu Anda kuasai agar dapat bekerja secara efisien dengan SciPy. Intinya, Anda harus tahu tentang struktur array dan bagaimana menangani tipe data serta memanipulasi bentuk array. Jika ini terdengar asing, pertimbangkan untuk mengikuti Python NumPy Tutorial dari DataCamp dan sambil belajar, jangan lupa melihat lembar contekan NumPy.

Jika Anda sudah mengetahui semua ini, lewati bagian berikut dan langsung ke “Aljabar Linear dengan SciPy”, tetapi siapkan lembar contekan SciPy untuk aljabar linear!

data science courses banner

Hal-Hal Esensial dari Objek NumPy ndarray

Secara struktural, array tidak lain adalah pointer. Ini adalah kombinasi dari alamat memori, tipe data, bentuk, dan strides. Ini berisi informasi tentang data mentah, bagaimana menemukan sebuah elemen dan bagaimana menafsirkan sebuah elemen.

Alamat memori dan strides penting ketika Anda menggali lebih dalam detail tingkat rendah dari array, sementara tipe data dan bentuk adalah hal yang pasti harus diketahui dan dipahami pemula. Dua atribut lain yang mungkin ingin Anda pertimbangkan adalah data dan size, yang memungkinkan Anda mengumpulkan lebih banyak informasi tentang array Anda.

Segarkan penggunaan atribut ndarray pada potongan DataCamp Light berikut. Array myArray sudah dimuat. Anda bisa memeriksanya dengan mengetikkannya di shell IPython dan menekan ENTER.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoW1sxLDIsM10sWzQsNSw2XV0pIiwic2FtcGxlIjoiIyBJbnNwZWN0IHRoZSBkYXRhIG9mIGBteUFycmF5YFxucHJpbnQobXlBcnJheS5kYXRhKVxuXG4jIEluc3BlY3QgdGhlIGRhdGEgdHlwZSBvZiBgbXlBcnJheWBcbnByaW50KF9fX19fX19fX19fX19fX19fKVxuXG4jIEluc3BlY3QgdGhlIHNoYXBlIG9mIGBteUFycmF5YFxucHJpbnQoX19fX19fX19fX19fX19fX19fKVxuXG4jIEluc3BlY3QgdGhlIHNpemUgb2YgYG15QXJyYXlgXG5wcmludChfX19fX19fX19fX19fX19fX18pIiwic29sdXRpb24iOiIjIEluc3BlY3QgdGhlIGRhdGEgb2YgYG15QXJyYXlgXG5wcmludChteUFycmF5LmRhdGEpXG5cbiMgSW5zcGVjdCB0aGUgZGF0YSB0eXBlIG9mIGBteUFycmF5YFxucHJpbnQobXlBcnJheS5kdHlwZSlcblxuIyBJbnNwZWN0IHRoZSBzaGFwZSBvZiBgbXlBcnJheWBcbnByaW50KG15QXJyYXkuc2hhcGUpXG5cbiMgSW5zcGVjdCB0aGUgc2l6ZSBvZiBgbXlBcnJheWBcbnByaW50KG15QXJyYXkuc2l6ZSkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFxuICAgIFwicHJpbnRcIixcbiAgICAxLFxuICAgIG5vdF9jYWxsZWRfbXNnPVwiRGlkIHlvdSBwcmludCBvdXQgYG15QXJyYXkuZGF0YWA/XCIsXG4gICAgaW5jb3JyZWN0X21zZz1cIkRvbid0IGZvcmdldCB0byBwcmludCBvdXQgdGhlIGRhdGEgb2YgYG15QXJyYXlgIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDIsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlBcnJheS5kdHlwZWA/XCIsXG4gICAgaW5jb3JyZWN0X21zZz1cIkRvbid0IGZvcmdldCB0byBwcmludCBvdXQgdGhlIGRhdGEgdHlwZSBvZiBgbXlBcnJheWAhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMyxcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBteUFycmF5LnNoYXBlYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHByaW50IG91dCB0aGUgc2hhcGUgb2YgYG15QXJyYXlgIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDQsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCB0aGUgYG15QXJyYXkuc2l6ZWA/XCIsXG4gICAgaW5jb3JyZWN0X21zZz1cIkRvbid0IGZvcmdldCB0byBwcmludCBvdXQgdGhlIHNpemUgb2YgYG15QXJyYXlgIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9

Anda akan melihat pada hasil kode di potongan kode di atas bahwa tipe data myArray adalah int64. Saat Anda intens bekerja dengan array, Anda pasti ingat bahwa ada cara untuk mengonversi array dari satu tipe data ke tipe lain dengan metode astype().

Namun demikian, saat Anda menggunakan SciPy dan NumPy bersama, Anda mungkin juga menemukan fungsi-fungsi NumPy untuk penanganan tipe berikut sangat berguna, terutama saat bekerja dengan bilangan kompleks:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoW1sxKzVqLDIsMys2al0sWzQrMWosNSw2KzJqXV0pIiwic2FtcGxlIjoiIyBSZXR1cm4gdGhlIHJlYWwgcGFydCBvZiBgbXlBcnJheWAgZWxlbWVudHNcbm5wLnJlYWwobXlBcnJheSlcblxuIyBSZXR1cm4gdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGBteUFycmF5YCBlbGVtZW50c1xubnAuaW1hZyhteUFycmF5KVxuXG4jIFJldHVybiBhIHJlYWwgYXJyYXkgaWYgdGhlIGNvbXBsZXggcGFydHMgYXJlIGNsb3NlIHRvIDBcbm5wLnJlYWxfaWZfY2xvc2UobXlBcnJheSx0b2w9MTAwMClcblxuIyBDYXN0IGBteUFycmF5YCB0byBmbG9hdFxubnAuY2FzdFsnZiddKG15QXJyYXkpIn0=

Coba tambahkan pemanggilan print() untuk melihat hasil dari kode di atas. Lalu, Anda akan melihat bahwa bilangan kompleks memiliki bagian real dan imajiner. Fungsi np.real() dan np.imag() dirancang untuk mengembalikan bagian-bagian ini kepada pengguna.

Alternatifnya, Anda juga dapat menggunakan np.cast untuk mengubah objek array ke tipe data lain, seperti float pada contoh di atas.

Satu-satunya hal yang cukup menonjol dari sisi kesulitan pada potongan kode di atas adalah fungsi np.real_if_close(). Ketika Anda memberinya masukan kompleks, seperti myArray, Anda akan mendapatkan array real jika bagian kompleksnya mendekati nol. Bagian terakhir ini, “mendekati 0”, dapat Anda atur sendiri dengan argumen tol yang dapat Anda berikan ke fungsi. Bereksperimenlah dengan ambang batasnya untuk melihat apa yang terjadi!

Pembuatan Array

Anda sekarang telah melihat bagaimana memeriksa array dan melakukan penyesuaian pada tipe datanya, tetapi Anda belum secara eksplisit melihat cara membuat array. Anda seharusnya sudah tahu bahwa Anda dapat menggunakan np.array() untuk melakukannya, tetapi ada juga rutin lain untuk pembuatan array yang perlu Anda ketahui: np.eye() dan np.identity().

Fungsi np.eye() memungkinkan Anda membuat matriks persegi dengan dimensi yang sama dengan bilangan bulat positif yang Anda berikan sebagai argumen ke fungsi. Entri umumnya diisi dengan nol, hanya diagonal matriks yang diisi dengan angka satu. Fungsi np.identity() bekerja dan melakukan hal yang sama serta mengembalikan array identitas.

Namun, perhatikan bahwa np.eye() dapat mengambil argumen tambahan k yang dapat Anda tentukan untuk memilih indeks diagonal yang ingin Anda isi dengan angka satu.

Fungsi pembuatan array lain yang hampir pasti berguna saat Anda bekerja dengan matriks untuk aljabar linear adalah sebagai berikut:

  • Fungsi np.arange() membuat array dengan nilai berjarak seragam antara dua angka. Anda dapat menentukan jarak antar elemen,
  • Hal yang sama juga berlaku untuk np.linspace(), tetapi dengan fungsi ini Anda menentukan jumlah elemen yang Anda inginkan dalam array.
  • Terakhir, fungsi np.logspace() juga membuat array dengan nilai berjarak seragam, tetapi kali ini pada skala logaritmik. Ini berarti jaraknya sekarang logaritmik: dua angka berjarak sama di antara logaritme kedua angka tersebut berbasis 10.

Fungsi-fungsi ini membuat array dalam bentuk kisi, yang dapat digunakan untuk membuat mesh grid, yang telah Anda baca sebelumnya di pos ini.

Catatan bahwa numpy sudah diimpor sebagai np pada potongan kode di bawah!

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIiwic2FtcGxlIjoiIyBDcmVhdGUgYSAyWDIgaWRlbnRpdHkgbWF0cml4IHdpdGggYG5wLmV5ZSgpYFxuX19fX19fX19fX19fX19fX19fXG5cbiMgQ3JlYXRlIGEgM1gzIGlkZW50aXR5IG1hdHJpeCB3aXRoIGBucC5pZGVudGl0eSgpYFxuX19fX19fX19fX19fX19fX19fXG5cbiMgVW5pZm9ybWx5IHNwYWNlZCB2YWx1ZXM6IHNwYWNpbmdcbl9fX19fX19fXygzLCA3LCAyKVxuXG4jIFVuaWZvcm1seSBzcGFjZWQgdmFsdWVzOiBudW1iZXIgb2Ygc2FtcGxlc1xuX19fX19fX19fX18oMiwgMywgNSlcblxuIyBVbmlmb3JtbHkgc3BhY2VkIHZhbHVlczogbG9nYXJpdGhtaWMgc3BhY2luZyBcbl9fX19fX19fX19fKDIsIDMsIDQpIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIDJYMiBpZGVudGl0eSBtYXRyaXggd2l0aCBgbnAuZXllKClgXG5ucC5leWUoMilcblxuIyBDcmVhdGUgYSAzWDMgaWRlbnRpdHkgbWF0cml4IHdpdGggYG5wLmlkZW50aXR5KClgXG5ucC5pZGVudGl0eSgzKVxuXG4jIFVuaWZvcm1seSBzcGFjZWQgdmFsdWVzOiBzcGFjaW5nXG5ucC5hcmFuZ2UoMywgNywgMilcblxuIyBVbmlmb3JtbHkgc3BhY2VkIHZhbHVlczogbnVtYmVyIG9mIHNhbXBsZXNcbm5wLmxpbnNwYWNlKDIsIDMsIDUpXG5cbiMgVW5pZm9ybWx5IHNwYWNlZCB2YWx1ZXM6IGxvZ2FyaXRobWljIHNwYWNpbmcgXG5ucC5sb2dzcGFjZSgyLCAzLCA0KSIsInNjdCI6InRlc3RfZnVuY3Rpb24oXCJudW1weS5leWVcIiwgYXJncz1bMF0sIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IHVzZSBgbnAuZXllKClgIHRvIGNyZWF0ZSBhIDJ4MiBpZGVudGl0eSBtYXRyaXg/XCIpXG50ZXN0X2Z1bmN0aW9uKFwibnVtcHkuaWRlbnRpdHlcIiwgYXJncz1bMF0sIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IHVzZSBgbnAuaWRlbnRpdHkoKWAgdG8gY3JlYXRlIGEgM3gzIGlkZW50aXR5IG1hdHJpeD9cIilcbnRlc3RfZnVuY3Rpb24oXCJudW1weS5hcmFuZ2VcIilcbnRlc3RfZnVuY3Rpb24oXCJudW1weS5saW5zcGFjZVwiKVxudGVzdF9mdW5jdGlvbihcIm51bXB5LmxvZ3NwYWNlXCIpXG5zdWNjZXNzX21zZyhcIkdyZWF0IGpvYiFcIikifQ==

Sekarang setelah Anda menyegarkan ingatan dan tahu cara menangani tipe data array, saatnya membahas topik pengindeksan dan pemotongan (slicing).

Indexing dan Slicing

Dengan indexing, Anda pada dasarnya menggunakan tanda kurung siku [] untuk mengindeks nilai array. Dengan kata lain, Anda dapat menggunakan indexing jika ingin mengakses elemen tertentu — sebuah subset — dari array. Melakukan slicing pada data Anda mirip dengan membuat subset, tetapi dapat dianggap sedikit lebih lanjut. Ketika Anda melakukan slicing pada array, Anda tidak hanya mempertimbangkan nilai tertentu, melainkan bekerja dengan “wilayah” data alih-alih sekadar “lokasi”.

Segarkan kedua konsep tersebut dengan contoh kode berikut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KVxubXlfM2RBcnJheSA9IG5wLmFycmF5KFtbWzEsMiwzLDRdLCBbNSw2LDcsOF1dLCBbWzEsMiwzLDRdLCBbOSwxMCwxMSwxMl1dXSwgZHR5cGU9bnAuaW50NjQpIiwic2FtcGxlIjoiIyBTbGljZSBgbXlBcnJheWAgYXQgaW5kZXggMCBhbmQgMVxucHJpbnQoX19fX19fX19fX19fKVxuXG4jIFNsaWNlIGBteV8yZEFycmF5YCBhdCByb3cgMCBhbmQgMSwgY29sdW1uIDFcbnByaW50KF9fX19fX19fX19fX19fX18pXG5cbiMgU2xpY2UgYG15XzNkQXJyYXlgIGF0IHJvdyAxXG5wcmludChteV8zZEFycmF5WzEsLi4uXSlcblxuIyBCb29sZWFuIGluZGV4aW5nOiBvbmx5IHZhbHVlcyA8IDJcbnByaW50KG15QXJyYXlbX19fX19fX19fX19fXSlcblxuIyBGYW5jeSBpbmRleGluZ1xucHJpbnQobXlfMmRBcnJheVtbMSwgMCwgMSwgMF0sWzAsIDEsIDIsIDBdXSkiLCJzb2x1dGlvbiI6IiMgU2xpY2UgYG15QXJyYXlgIGF0IGluZGV4IDAgYW5kIDFcbnByaW50KG15QXJyYXlbMDoyXSlcblxuIyBTbGljZSBgbXlfMmRBcnJheWAgYXQgcm93IDAgYW5kIDEsIGNvbHVtbiAxXG5wcmludChteV8yZEFycmF5WzA6MiwxXSlcblxuIyBTbGljZSBgbXlfM2RBcnJheWAgYXQgcm93IDFcbnByaW50KG15XzNkQXJyYXlbMSwuLi5dKVxuXG4jIEJvb2xlYW4gaW5kZXhpbmc6IG9ubHkgdmFsdWVzIDwgMlxucHJpbnQobXlBcnJheVtteUFycmF5PDJdKVxuXG4jIEZhbmN5IGluZGV4aW5nXG5wcmludChteV8yZEFycmF5W1sxLCAwLCAxLCAwXSxbMCwgMSwgMiwgMF1dKSIsInNjdCI6InRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDEsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlBcnJheVswOjJdYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHNsaWNlIGBteUFycmF5YCBhdCBpbmRleCAwIGFuZCAxIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDIsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlfMmRBcnJheVswOjIsMV1gP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gc2xpY2UgYG15XzJkQXJyYXlgIGF0IGluZGV4IDAgYW5kIDEsIGNvbHVtbiAxIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDMsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlfM2RBcnJheVsxLC4uLl1gP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gc2xpY2UgYG15XzNkQXJyYXlgIGF0IHJvdyAxIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDQsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlBcnJheVtteUFycmF5PDJdYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgY29uZGl0aW9uIGBteUFycmF5PDJgIHRvIGBteUFycmF5YCFcIixcbiAgICBkb19ldmFsPUZhbHNlXG4pXG50ZXN0X2Z1bmN0aW9uKFxuICAgIFwicHJpbnRcIixcbiAgICA1LFxuICAgIG5vdF9jYWxsZWRfbXNnPVwiRGlkIHlvdSBwcmludCBvdXQgYG15XzJkQXJyYXlbWzEsIDAsIDEsIDBdLFswLCAxLCAyLCAwXV1gP1wiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnN1Y2Nlc3NfbXNnKFwiWWF5ISBZb3UncmUgYW4gZXhwZXJ0IGluIGluZGV4aW5nIGFuZCBzbGljaW5nIHdpdGggTnVtUHkhXCIpIn0=

Sekarang setelah pikiran Anda segar dengan slicing dan indexing, Anda mungkin juga tertarik pada beberapa trik indeks yang dapat membuat pekerjaan Anda lebih efisien saat memasuki komputasi ilmiah bersama SciPy. Ada empat fungsi yang pasti akan muncul yaitu np.mgrid(), np.ogrid(), np.r dan np.c.

Anda mungkin sudah mengetahui dua fungsi terakhir jika Anda sudah memiliki sedikit pengalaman dengan NumPy. np.r dan np.c sering digunakan ketika Anda perlu menumpuk array secara baris (row-wise) atau kolom (column-wise). Dengan fungsi-fungsi ini, Anda dapat dengan cepat menyusun array alih-alih menggunakan fungsi np.concatenate().

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5hcnJheSA9IG5wLmV5ZSgyKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgZGVuc2UgbWVzaGdyaWRcbm5wLm1ncmlkWzE6MTE6MiwgLTEyOi0zOjNdXG5cbiMgQ3JlYXRlIGFuIG9wZW4gbWVzaGdyaWRcbm5wLm9ncmlkWzE6MTE6MiwgLTEyOi0zOjNdXG5cbiMgU3RhY2sgYXJyYXlzIHZlcnRpY2FsbHlcbm5wLnJfWzMsWzBdKjUsLTE6MToxMGpdXG5cbiMgU3RhY2sgYXJyYXlzIGhvcml6b250YWxseSBcbm5wLmNfW2FycmF5LCBteV8yZEFycmF5XSJ9

Dengan melihat dua fungsi pertama dari empat fungsi ini, Anda mungkin bertanya mengapa Anda memerlukan meshgrid. Anda dapat menggunakan meshgrid untuk membuat dua array yang berisi koordinat x dan y pada setiap posisi dalam kisi segi empat. Fungsi np.meshgrid() mengambil dua array 1D dan menghasilkan dua matriks 2D yang sesuai dengan semua pasangan (x, y) dalam kedua array.

  • Fungsi np.mgrid() adalah implementasi meshgrid MATLAB dan mengembalikan array yang memiliki bentuk yang sama. Itu berarti dimensi dan jumlah array keluaran sama dengan jumlah dimensi pengindeksan.
  • Fungsi np.ogrid(), di sisi lain, memberikan meshgrid terbuka dan tidak sedens hasil yang diberikan fungsi np.mgrid(). Anda dapat melihat perbedaan visual antara keduanya pada potongan kode di atas.

Anda juga dapat membaca perbedaan antara kedua fungsi ini di sini.

Fungsi lain yang mungkin dapat Anda gunakan untuk keperluan indexing/slicing adalah fungsi np.select(). Anda dapat menggunakannya untuk mengembalikan nilai dari daftar array bergantung pada kondisi, yang dapat Anda tentukan sendiri di argumen pertama fungsi. Pada argumen kedua, Anda meneruskan array yang ingin Anda pertimbangkan untuk proses seleksi ini.

Lihat contoh berikut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGEgMkQgYXJyYXkgXG5teV8yZEFycmF5ID0gbnAuYXJyYXkoW1sxLDIsMyw0XSwgWzUsNiw3LDhdXSwgZHR5cGU9bnAuaW50NjQpXG5cbiMgU2VsZWN0IHZhbHVlcyBmcm9tIGBteV8yZEFycmF5YFxubnAuc2VsZWN0KFtteV8yZEFycmF5IDwgNF0sW215XzJkQXJyYXkgKiAyXSkifQ==

Hebat! Sekarang setelah Anda memilih nilai yang tepat dari array asli, Anda masih dapat memilih bentuk dan memanipulasi array baru Anda.

Pemilihan dan Manipulasi Bentuk

NumPy menawarkan banyak cara untuk memilih dan memanipulasi bentuk array Anda dan Anda mungkin sudah mengetahui banyak di antaranya. Bagian berikut hanya akan memberikan ringkasan singkat tentang fungsi-fungsi yang mungkin berguna, jadi postingan ini tidak akan membahas semuanya.

Nah, adakah fungsi yang berguna saat Anda bekerja dengan SciPy?

Yang paling bermanfaat adalah yang dapat membantu Anda meratakan (flatten) array, menumpuk (stack) dan membagi (split) array. Anda sudah melihat fungsi np.c dan np.r yang sering Anda pilih alih-alih np.concatenate(), tetapi masih banyak lagi yang perlu Anda ketahui!

Seperti np.hstack() untuk menumpuk array secara horizontal atau np.vstack() untuk menumpuk array secara vertikal. Demikian pula, Anda dapat menggunakan np.vsplit() dan np.hsplit() untuk membagi array Anda secara vertikal dan horizontal. Namun Anda mungkin sudah mengetahui semua ini.

Buktikan pada potongan kode berikut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KVxubXlfM2RBcnJheSA9IG5wLmFycmF5KFtbWzEsMiwzLDRdLCBbNSw2LDcsOF1dLCBbWzEsMiwzLDRdLCBbOSwxMCwxMSwxMl1dXSwgZHR5cGU9bnAuaW50NjQpIiwic2FtcGxlIjoiI1N0YWNrIGFycmF5cyBob3Jpem9udGFsbHkgKGNvbHVtbi13aXNlKVxucHJpbnQoX19fX19fX19fKChucC5leWUoMiksIG15XzJkQXJyYXkpKSlcblxuIyBTdGFjayBhcnJheXMgdmVydGljYWxseSAocm93LXdpc2UpXG5wcmludChfX19fX19fX19fKChteUFycmF5LCBteV8yZEFycmF5KSkpXG5cbiMgU3BsaXQgdGhlIGFycmF5IGhvcml6b250YWxseSBhdCB0aGUgMm5kIGluZGV4XG5wcmludChfX19fX19fX19fXyhteV8yZEFycmF5LCAyKSlcblxuIyBTcGxpdCB0aGUgYXJyYXkgdmVydGljYWxseSBhdCB0aGUgMm5kIGluZGV4XG5wcmludChfX19fX19fX19fX18obXlfMmRBcnJheSwgMikpIiwic29sdXRpb24iOiIjU3RhY2sgYXJyYXlzIGhvcml6b250YWxseSAoY29sdW1uLXdpc2UpXG5wcmludChucC5oc3RhY2soKG5wLmV5ZSgyKSwgbXlfMmRBcnJheSkpKVxuXG4jIFN0YWNrIGFycmF5cyB2ZXJ0aWNhbGx5IChyb3ctd2lzZSlcbnByaW50KG5wLnZzdGFjaygobXlBcnJheSwgbXlfMmRBcnJheSkpKVxuXG4jIFNwbGl0IHRoZSBhcnJheSBob3Jpem9udGFsbHkgYXQgdGhlIDJuZCBpbmRleFxucHJpbnQobnAuaHNwbGl0KG15XzJkQXJyYXksIDIpKVxuXG4jIFNwbGl0IHRoZSBhcnJheSB2ZXJ0aWNhbGx5IGF0IHRoZSAybmQgaW5kZXhcbnByaW50KG5wLnZzcGxpdChteV8yZEFycmF5LCAyKSkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFxuICAgIFwicHJpbnRcIixcbiAgICAxLFxuICAgIG5vdF9jYWxsZWRfbXNnPVwiRGlkIHlvdSBwcmludCBvdXQgYG5wLmhzdGFjaygobnAuZXllKDIpLCBteV8yZEFycmF5KSlgP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gc3RhY2sgYG5wLmV5ZSgyKWAgYW5kIGBteV8yZEFycmF5YCBob3Jpem9udGFsbHkhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMixcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBucC52c3RhY2sobXlBcnJheSwgbXlfMmRBcnJheSkpYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHN0YWNrIGBteUFycmF5YCBhbmQgYG15XzJkQXJyYXlgIHZlcnRpY2FsbHkhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMyxcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBucC5oc3BsaXQobXlfMmRBcnJheSwgMilgP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gaG9yaXpvbnRhbGx5IHNwbGl0IGBteV8yZEFycmF5YCBhdCB0aGUgMm5kIGluZGV4IVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDQsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbnAudnNwbGl0KG15XzJkQXJyYXksIDIpYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHZlcnRpY2FsbHkgc3BsaXQgYG15XzJkQXJyYXlgIGF0IGluZGV4IDIhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxuc3VjY2Vzc19tc2coXCJZb3UncmUgYSB0cnVlIG1hc3RlciBpbiBzdGFja2luZyBhbmQgc3BsaXR0aW5nIGFycmF5cyFcIikifQ==

Ingat bahwa fungsi np.eye() membuat array identitas 2X2, yang sempurna untuk ditumpuk dengan array 2-D yang telah dimuat untuk Anda di potongan kode di atas.

Jika Anda ingin mengetahui lebih lanjut tentang kondisi yang perlu diperhatikan jika ingin menumpuk array, masuk ke sini. Namun, Anda juga bisa sekadar melihat array dan apa yang dilakukan fungsi untuk membangun intuisi tentang ‘aturan’ apa yang perlu dihormati jika ingin menggabungkan dua array berdasarkan baris atau kolom.

Hal terpenting yang perlu Anda perhatikan saat membagi array mungkin adalah bentuk (shape) array Anda, karena Anda ingin memilih indeks yang benar di mana pemisahan akan terjadi.

Selain fungsi untuk menumpuk dan membagi array, Anda juga perlu mengingat bahwa fungsi yang membantu memastikan Anda bekerja dengan array berdimensi tertentu sangat diperlukan saat Anda menyelami lebih dalam komputasi ilmiah.

Pertimbangkan fungsi-fungsi berikut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KVxubXlfM2RBcnJheSA9IG5wLmFycmF5KFtbWzEsMiwzLDRdLCBbNSw2LDcsOF1dLCBbWzEsMiwzLDRdLCBbOSwxMCwxMSwxMl1dXSwgZHR5cGU9bnAuaW50NjQpIiwic2FtcGxlIjoiI1Blcm11dGUgYG15QXJyYXlgIGRpbWVuc2lvbnNcbnByaW50KG5wLnRyYW5zcG9zZShteUFycmF5KSlcblxuIyBGbGF0dGVuIGBteV8zZEFycmF5YFxucHJpbnQobXlfM2RBcnJheS5mbGF0dGVuKCkpXG5cbiMgUmVzaGFwZSBidXQgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhXG5wcmludChteV8yZEFycmF5LnJlc2hhcGUoNCwyKSlcblxuIyBSZXNpemUgdG8gKDYsNClcbnByaW50KG5wLnJlc2l6ZShteV8zZEFycmF5LCAoNiw0KSkpIn0=

Catatan perbedaan antara reshape dan resize pada array Anda. Dengan yang pertama, Anda mengubah bentuk data tetapi tidak mengubah datanya. Saat Anda melakukan resize, ada kemungkinan data dalam array akan berubah, bergantung pada bentuk yang Anda pilih, tentu saja.

Selain rutin pembagian dan penumpukan serta fungsi yang memungkinkan Anda memanipulasi array lebih lanjut, ada juga hal seperti “vektorisasi” yang perlu Anda pertimbangkan. Saat Anda menerapkan sebuah fungsi pada array, biasanya Anda menerapkannya pada setiap elemen array. Pertimbangkan, misalnya, menerapkan np.cos(), np.sin() atau np.tan() pada sebuah array. Anda akan melihat bahwa fungsi tersebut bekerja pada semua elemen array. Nah, ketika Anda melihat ini, Anda tahu bahwa fungsi tersebut sudah tervektorisasi.

Namun, ketika Anda mendefinisikan fungsi sendiri, seperti yang kemungkinan besar akan Anda lakukan saat memasuki komputasi ilmiah, Anda mungkin juga ingin memvektorisasikannya. Dalam kasus tersebut, Anda dapat memanggil np.vectorize():

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKSIsInNhbXBsZSI6IiMgRGVmaW5lIGEgZnVuY3Rpb24gYG15ZnVuY2BcbmRlZiBteWZ1bmMoYSxiKTpcbiAgaWYgYSA+IGI6XG4gICAgIHJldHVybiBhIC0gYlxuICBlbHNlOlxuICAgICByZXR1cm4gYSArIGJcbiAgICBcbiMgVmVjdG9yaXplIGBteWZ1bmNgXG52ZWN0b3JpemVkRnVuYyA9IG5wLnZlY3Rvcml6ZShteWZ1bmMpIFxuXG4jIEFwcGx5IFxudmVjdG9yaXplZEZ1bmMobXlBcnJheSwgMikifQ==

Untuk fungsi matematika tervektorisasi lain yang mungkin ingin Anda ketahui, pertimbangkan np.angle() untuk memberikan sudut dari elemen-elemen array kompleks, tetapi fungsi trigonometri dasar, eksponensial, atau logaritmik juga akan berguna.

Learn Python for Data Science With DataCamp

Aljabar Linear dengan SciPy

Sekarang setelah Anda tahu apa yang dibutuhkan untuk menggunakan kedua paket secara maksimal, saatnya menggali topik tutorial ini: aljabar linear.

Tetapi sebelum Anda membahas bagaimana Anda dapat menggunakan Python, pastikan workspace Anda benar-benar siap!

Instal SciPy

Tentu saja pertama-tama Anda harus memastikan bahwa Anda telah menginstal Python. Kunjungi halaman ini jika Anda masih perlu melakukannya :) Jika Anda bekerja di Windows, pastikan Anda telah menambahkan Python ke variabel lingkungan PATH. Selain itu, jangan lupa menginstal package manager, seperti pip, yang akan memastikan Anda dapat menggunakan pustaka open-source Python.

Catatan bahwa versi Python 3 terbaru sudah menyertakan pip, jadi periksa ulang apakah Anda memilikinya dan jika ya, lakukan upgrade sebelum menginstal paket lainnya:

 pip install pip --upgrade pip --version

Tetapi hanya menginstal package manager tidak cukup; Anda juga perlu mengunduh wheel untuk pustakanya: pergi ke sini untuk mendapatkan SciPy wheel Anda. Setelah diunduh, buka terminal pada direktori unduhan di PC Anda dan instal. Selain itu, Anda dapat memeriksa apakah instalasi berhasil dan mengonfirmasi versi paket yang Anda gunakan:

# Install the wheel install "scipy‑0.18.1‑cp36‑cp36m‑win_amd64.whl"# Confirm successful installimport scipy# Check package versionscipy.__version__

Setelah langkah-langkah ini, Anda siap jalan!

Tip: instal paket dengan mengunduh distribusi Anaconda Python. Ini cara mudah untuk cepat memulai, karena Anaconda tidak hanya menyertakan 100 paket Python, R, dan Scala terpopuler untuk data science, tetapi juga menyertakan beberapa lingkungan pengembangan kursus terbuka seperti Jupyter dan Spyder. Jika Anda ingin mulai bekerja dengan Jupyter Notebook, lihat tutorial Jupyter notebook ini.

Jika Anda belum mengunduhnya, pergi ke sini untuk mendapatkannya.

Vektor dan Matriks: Dasar-Dasar

Sekarang setelah Anda memastikan workspace siap, Anda akhirnya dapat mulai dengan aljabar linear di Python. Intinya, disiplin ini berkaitan dengan studi ruang vektor dan pemetaan linear yang ada di antaranya. Pemetaan linear ini dapat dideskripsikan dengan matriks, yang juga memudahkan perhitungan.

Ingat bahwa ruang vektor adalah konsep fundamental dalam aljabar linear. Ini adalah ruang di mana Anda memiliki kumpulan objek (vektor) dan di mana Anda dapat menambahkan atau menskalakan dua vektor tanpa membuat vektor hasil keluar dari ruang tersebut. Ingat juga bahwa vektor adalah baris (atau kolom) dari sebuah matriks.

Tetapi bagaimana ini bekerja di Python?

Anda dapat dengan mudah membuat vektor dengan fungsi np.array(). Demikian pula, Anda dapat memberikan struktur matriks pada setiap ndarray satu atau dua dimensi dengan perintah np.matrix() atau np.mat().

Cobalah pada potongan kode berikut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIiwic2FtcGxlIjoiIyBDcmVhdGUgYSB2ZWN0b3Jcbm15VmVjdG9yID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxuXG4jIENyZWF0ZSBhIG1hdHJpeFxubXlNYXRyaXggPSBucC5tYXRyaXgobnAucmFuZG9tLnJhbmRvbSgoNSw1KSkpIn0=

Jadi array dan matriks sama, selain dari pemformatan?

Tidak persis. Ada beberapa perbedaan:

  • Matriks bersifat 2-D, sementara array biasanya berdimensi n,
  • Seperti yang sudah disiratkan fungsi di atas, matriks adalah subclass dari ndarray,
  • Baik array maupun matriks memiliki .T(), tetapi hanya matriks yang memiliki .H() dan .I(),
  • Perkalian matriks bekerja berbeda dari perkalian elemen demi elemen pada array, dan
  • Selain itu, operasi ** memiliki hasil yang berbeda untuk matriks dan array

Saat bekerja dengan matriks, Anda terkadang memiliki matriks di mana sebagian besar elemennya nol. Matriks ini disebut “sparse matrix”, sedangkan yang sebagian besar elemennya bukan nol disebut “dense matrix”.

Hal ini tampak sepele, tetapi saat Anda bekerja dengan SciPy untuk aljabar linear, ini terkadang dapat membedakan modul yang Anda gunakan untuk menyelesaikan sesuatu. Secara lebih konkret, Anda dapat menggunakan scipy.linalg untuk matriks dense, tetapi saat bekerja dengan matriks sparse, Anda juga perlu mempertimbangkan modul scipy.sparse, yang juga memiliki scipy.sparse.linalg sendiri.

Untuk matriks sparse, ada cukup banyak opsi untuk membuatnya. Potongan kode di bawah mendaftar beberapa di antaranya:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5mcm9tIHNjaXB5IGltcG9ydCBzcGFyc2UgXG5DID0gbnAucmFuZG9tLnJhbmRvbSgoMTAsNSkpXG5DW0MgPiAwLjVdID0gMCAiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDJYMiBpZGVudGl0eSBtYXRyaXhcbm5wLmV5ZSgzLCBrPTEpICAgICAgICBcblxuIyBDcmVhdGUgYSAyeDIgaWRlbnRpdHkgbWF0cml4XG5ucC5tYXQobnAuaWRlbnRpdHkoMikpICAgICAgICAgXG5cbiMgQ29tcHJlc3NlZCBTcGFyc2UgUm93IG1hdHJpeFxuc3BhcnNlLmNzcl9tYXRyaXgoQykgIFxuXG4jIENvbXByZXNzZWQgU3BhcnNlIENvbHVtbiBtYXRyaXhcbnNwYXJzZS5jc2NfbWF0cml4KEMpICBcblxuIyBEaWN0aW9uYXJ5IE9mIEtleXMgbWF0cml4XG5zcGFyc2UuZG9rX21hdHJpeChDKSAgIn0=

Selain itu, ada juga beberapa fungsi lain yang dapat Anda gunakan untuk membuat matriks sparse: Block Sparse Row matrices dengan bsr_matrix(), matriks sparse format COOrdinate dengan coo_matrix(), matriks sparse penyimpanan DIAgonal dengan dia_matrix(), dan matriks sparse berbasis daftar tertaut per baris dengan lil_matrix().

Ada banyak opsi, tetapi mana yang harus Anda pilih jika Anda membuat matriks sparse sendiri?

Tidak sulit.

Pada dasarnya, ini bermuara pertama pada bagaimana Anda akan menginisialisasinya. Selanjutnya, pertimbangkan apa yang ingin Anda lakukan dengan matriks sparse Anda.

Secara lebih konkret, Anda dapat melalui daftar periksa berikut untuk memutuskan jenis matriks sparse yang ingin digunakan:

  • Jika Anda berencana mengisi matriks dengan angka satu per satu, pilih coo_matrix() atau dok_matrix() untuk membuat matriks Anda.
  • Jika Anda ingin menginisialisasi matriks dengan sebuah array sebagai diagonal, pilih dia_matrix() untuk menginisialisasi matriks Anda.
  • Untuk matriks berbasis potongan (sliced-based), gunakan lil_matrix().
  • Jika Anda menyusun matriks dari blok-blok matriks yang lebih kecil, pertimbangkan menggunakan bsr_matrix().
  • Jika Anda ingin akses cepat ke baris dan kolom, konversi matriks Anda dengan menggunakan fungsi csr_matrix() dan csc_matrix(), masing-masing. Dua fungsi terakhir tidak ideal dipilih saat Anda perlu menginisialisasi matriks, tetapi saat melakukan perkalian, Anda pasti akan merasakan perbedaan kecepatannya.

Mudah sekali!

Operasi Vektor

Sekarang setelah Anda mempelajari atau menyegarkan perbedaan antara vektor, matriks dense dan matriks sparse, saatnya melihat lebih dekat pada vektor dan operasi matematis apa yang dapat Anda lakukan dengannya. Tutorial ini berfokus secara eksplisit pada operasi matematis agar Anda melihat persamaan dan perbedaannya dengan matriks, dan karena sebagian besar aljabar linear pada akhirnya adalah bekerja dengan matriks.

Anda sudah melihat bahwa Anda dapat dengan mudah membuat vektor dengan np.array(). Namun sekarang setelah Anda memiliki vektor, Anda mungkin juga ingin mengetahui beberapa operasi dasar yang dapat dilakukan. vector1 dan vector2 sudah dimuat untuk Anda pada potongan kode berikut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG52ZWN0b3IxPW5wLmFycmF5KFsxLDIsM10pXG52ZWN0b3IyID0gbnAuYXJyYXkoWzIsMyw0XSkiLCJzYW1wbGUiOiIjIEFkZGl0aW9uIG9mIGB2ZWN0b3IxYCBhbmQgYHZlY3RvcjJgXG52ZWN0b3IzID0gdmVjdG9yMSArIHZlY3RvcjJcblxuIyBQcmludCBgdmVjdG9yM2BcbnByaW50KF9fX19fX18pXG5cbiMgU3VidHJhY3Rpb24gb2YgYHZlY3RvcjJgIGFuZCBgdmVjdG9yMWBcbnZlY3RvcjQgPSBfX19fX19fXyAtIHZlY3RvcjFcblxuIyBwcmludCBgdmVjdG9yNGBcbnByaW50KHZlY3RvcjQpXG5cbiMgRG90IHByb2R1Y3Qgb2YgYHZlY3RvcjFgIGFuZCBgdmVjdG9yMmBcbmRvdFByb2R1Y3QgPSBucC5kb3QodmVjdG9yMSwgdmVjdG9yMilcblxuIyBQcmludCBgZG90UHJvZHVjdGBcbnByaW50KGRvdFByb2R1Y3QpXG5cbiMgQ3Jvc3MgcHJvZHVjdCBvZiBgdmVjdG9yMWAgYW5kIGB2ZWN0b3IyYFxuY3Jvc3NQcm9kdWN0ID0gbnAuY3Jvc3MoX19fX19fX18sIHZlY3RvcjIpXG5cbiMgUHJpbnQgYGNyb3NzUHJvZHVjdGBcbnByaW50KF9fX19fX19fX19fXykiLCJzb2x1dGlvbiI6IiMgQWRkaXRpb24gb2YgYHZlY3RvcjFgIGFuZCBgdmVjdG9yMmBcbnZlY3RvcjMgPSB2ZWN0b3IxICsgdmVjdG9yMlxuXG4jIFByaW50IGB2ZWN0b3IzYCBvZiBgdmVjdG9yMmAgYW5kIGB2ZWN0b3IxYFxucHJpbnQodmVjdG9yMylcblxuIyBTdWJ0cmFjdGlvblxudmVjdG9yNCA9IHZlY3RvcjIgLSB2ZWN0b3IxXG5cbiMgcHJpbnQgYHZlY3RvcjRgXG5wcmludCh2ZWN0b3I0KVxuXG4jIERvdCBwcm9kdWN0IG9mIGB2ZWN0b3IxYCBhbmQgYHZlY3RvcjJgXG5kb3RQcm9kdWN0ID0gbnAuZG90KHZlY3RvcjEsIHZlY3RvcjIpXG5cbiMgUHJpbnQgYGRvdFByb2R1Y3RgXG5wcmludChkb3RQcm9kdWN0KVxuXG4jIENyb3NzIHByb2R1Y3Qgb2YgYHZlY3RvcjFgIGFuZCBgdmVjdG9yMmBcbmNyb3NzUHJvZHVjdCA9IG5wLmNyb3NzKHZlY3RvcjEsIHZlY3RvcjIpXG5cbiMgUHJpbnQgYGNyb3NzUHJvZHVjdGBcbnByaW50KGNyb3NzUHJvZHVjdCkiLCJzY3QiOiJ0ZXN0X29iamVjdChcInZlY3RvcjNcIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBpbmRleD0xKVxudGVzdF9vYmplY3QoXCJ2ZWN0b3I0XCIpXG50ZXN0X2Z1bmN0aW9uKFwicHJpbnRcIiwgaW5kZXg9MilcbnRlc3Rfb2JqZWN0KFwiZG90UHJvZHVjdFwiKVxudGVzdF9mdW5jdGlvbihcInByaW50XCIsIGluZGV4PTMpXG50ZXN0X29iamVjdChcImNyb3NzUHJvZHVjdFwiKVxudGVzdF9mdW5jdGlvbihcInByaW50XCIsIGluZGV4PTQpXG5zdWNjZXNzX21zZyhcIldlbGwgZG9uZSFcIikifQ==

Sekarang setelah Anda berhasil melihat beberapa operasi vektor, saatnya mulai mengerjakan pekerjaan matriks yang sesungguhnya!

Matriks: Operasi dan Rutin

Mirip dengan tempat Anda tinggalkan di awal bagian sebelumnya, Anda tahu cara membuat matriks, tetapi Anda belum tahu bagaimana menggunakannya untuk keuntungan Anda. Bagian ini akan memberi Anda ikhtisar beberapa fungsi matriks dan rutin matriks dasar yang dapat Anda gunakan untuk bekerja secara efisien.

Pertama, mari kita bahas beberapa fungsi. Ini akan cukup mudah jika Anda pernah bekerja dengan NumPy, tetapi bahkan jika Anda belum memiliki pengalaman, Anda akan melihat bahwa fungsi-fungsi ini mudah dijalankan.

Mari lihat beberapa contoh fungsi.

Ada np.add() dan np.subtract() untuk menjumlah dan mengurang array atau matriks, dan juga np.divide() dan np.multiply untuk pembagian dan perkalian. Ini benar-benar bukan misteri besar, bukan? Fungsi np.dot() yang Anda lihat di bagian sebelumnya saat digunakan untuk menghitung dot product, juga dapat digunakan dengan matriks. Tetapi jangan lupa untuk meneruskan dua matriks alih-alih vektor.

Ini dasar, bukan?

Mari sedikit kurang dasar. Untuk perkalian, ada juga beberapa fungsi lain yang dapat Anda pertimbangkan, seperti np.vdot() untuk dot product vektor, np.inner() atau np.outer() untuk inner atau outer product array, np.tensordot() dan np.kron() untuk produk Kronecker dari dua array:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5tYXRyaXgxID0gbnAubWF0cml4KG5wLnJhbmRvbS5yYW5kb20oKDIsMikpKVxubWF0cml4MiA9IG5wLm1hdChbWzMsNF0sIFs1LDZdXSlcbnZlY3RvcjE9bnAuYXJyYXkoWzEsMiwzXSlcbnZlY3RvcjIgPSBucC5hcnJheShbMiwzLDRdKSIsInNhbXBsZSI6IiMgVmVjdG9yIGRvdCBwcm9kdWN0XG52ZWN0b3JEb3RQcm9kdWN0ID0gbnAudmRvdCh2ZWN0b3IxLCB2ZWN0b3IyKVxuXG4jIElubmVyIHByb2R1Y3RcbmlubmVyUHJvZHVjdCA9IG5wLmlubmVyKHZlY3RvcjEsIHZlY3RvcjIpXG5cbiMgT3V0ZXIgcHJvZHVjdFxub3V0ZXJQcm9kdWN0ID0gbnAub3V0ZXIodmVjdG9yMSwgdmVjdG9yMilcblxuIyBUZW5zb3IgZG90IHByb2R1Y3RcbnRlbnNvckRvdFByb2R1Y3QgPSBucC50ZW5zb3Jkb3QobWF0cml4MSwgbWF0cml4MilcblxuIyBLcm9uZWNrZXIgcHJvZHVjdFxua3JvblByb2R1Y3QgPSBucC5rcm9uKG1hdHJpeDEsIG1hdHJpeDIpIn0=

Tip: tambahkan pernyataan print pada potongan kode di atas untuk melihat hasil masing-masing produk.

Selain itu, mungkin juga berguna mempertimbangkan beberapa fungsi dari modul linalg: fungsi eksponensial matriks linalg.expm(), linalg.expm2() dan linalg.expm3(). Perbedaan antara ketiganya terletak pada cara eksponensial dihitung. Tetaplah pada yang pertama untuk eksponensial matriks umum, tetapi pastikan untuk mencoba ketiganya untuk melihat perbedaan hasil!

Juga fungsi trigonometri seperti linalg.cosm(), linalg.sinm() dan linalg.tanm(), fungsi trigonometri hiperbolik seperti linalg.coshm(), linalg.sinhm() dan linalg.tanhm(), fungsi tanda linalg.signm(), logaritma matriks linalg.logm(), dan akar kuadrat matriks linalg.sqrtm().

Selain itu, Anda juga dapat mengevaluasi fungsi matriks dengan bantuan fungsi linalg.funm(). Lihat contoh di bawah ini:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZnJvbSBzY2lweSBpbXBvcnQgbGluYWxnXG5pbXBvcnQgbnVtcHkgYXMgbnAgXG5teU1hdHJpeCA9IG5wLm1hdHJpeChucC5yYW5kb20ucmFuZG9tKCg1LDUpKSkiLCJzYW1wbGUiOiJsaW5hbGcuZnVubShteU1hdHJpeCwgbGFtYmRhIHg6IHgqeCkifQ==

Anda melihat bahwa Anda meneruskan matriks yang ingin Anda terapkan fungsi sebagai argumen pertama dan sebuah fungsi (dalam kasus ini fungsi lambda) yang ingin Anda terapkan pada matriks yang Anda berikan. Perhatikan bahwa fungsi yang Anda berikan ke linalg.funm() harus tervektorisasi.

Sekarang mari kita lihat beberapa rutin matriks dasar. Hal pertama yang mungkin ingin Anda cek adalah atribut matriks: T untuk transpos, H untuk transpos konjugat, I untuk invers, dan A untuk mengubah menjadi array.

Cobalah:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIFxubXlNYXRyaXggPSBucC5tYXRyaXgobnAucmFuZG9tLnJhbmRvbSgoNSw1KSkpIiwic2FtcGxlIjoiIyBUcmFuc3Bvc2l0aW9uXG5teU1hdHJpeC5fXG5cbiMgQ29uanVnYXRlIHRyYW5zcG9zaXRpb25cbm15TWF0cml4Ll9cblxuIyBJbnZlcnNlXG5teU1hdHJpeC5fXG5cbiMgQXJyYXlcbm15TWF0cml4Ll8iLCJzb2x1dGlvbiI6IiMgVHJhbnNwb3NpdGlvblxubXlNYXRyaXguVFxuXG4jIENvbmp1Z2F0ZSB0cmFuc3Bvc2l0aW9uXG5teU1hdHJpeC5IXG5cbiMgSW52ZXJzZVxubXlNYXRyaXguSVxuXG4jIEFycmF5XG5teU1hdHJpeC5BIiwic2N0IjoidGVzdF9vYmplY3RfYWNjZXNzZWQoXCJteU1hdHJpeC5UXCIpXG50ZXN0X29iamVjdF9hY2Nlc3NlZChcIm15TWF0cml4LkhcIilcbnRlc3Rfb2JqZWN0X2FjY2Vzc2VkKFwibXlNYXRyaXguSVwiKVxudGVzdF9vYmplY3RfYWNjZXNzZWQoXCJteU1hdHJpeC5BXCIpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

Saat Anda mentranspos sebuah matriks, Anda membuat matriks baru yang barisnya adalah kolom dari matriks asli. Transpos konjugat, di sisi lain, menukar indeks baris dan kolom untuk setiap elemen matriks. Invers dari sebuah matriks adalah matriks yang, jika dikalikan dengan matriks asli, menghasilkan matriks identitas.

Namun selain atribut tersebut, ada juga fungsi nyata yang dapat Anda gunakan untuk melakukan beberapa rutin matriks dasar, seperti np.transpose() dan linalg.inv() masing-masing untuk transpos dan invers matriks.

Selain itu, Anda juga dapat mengambil trace atau jumlah elemen pada diagonal utama matriks dengan np.trace(). Demikian pula, Anda juga dapat mengambil rank matriks atau jumlah nilai singular dari Singular Value Decomposition dari sebuah array yang lebih besar dari ambang tertentu dengan linalg.matrix_rank dari NumPy.

Jangan khawatir jika rank matriks belum masuk akal saat ini; Anda akan melihat lebih lanjut tentang itu nanti di tutorial ini.

Untuk saat ini, mari fokus pada dua rutin lagi yang dapat Anda gunakan:

  • Norma matriks dapat dihitung dengan linalg.norm: norma matriks adalah sebuah angka yang didefinisikan berdasarkan entri-entri matriks. Norma adalah kuantitas berguna yang dapat memberikan informasi penting tentang matriks karena memberi tahu seberapa besar elemennya.
  • Di atas itu, Anda juga dapat menghitung determinan, yang merupakan nilai berguna yang dapat dihitung dari elemen-elemen matriks persegi, dengan linalg.det(). Determinan mereduksi matriks persegi menjadi sebuah angka tunggal, yang menentukan apakah matriks persegi dapat diinvers atau tidak.

Terakhir, menyelesaikan sistem persamaan linear besar adalah salah satu aplikasi paling dasar dari matriks. Jika Anda memiliki sistem \(Ax = b\), di mana \(A\) adalah matriks persegi dan \(b\) adalah matriks umum, Anda memiliki dua metode yang dapat digunakan untuk menemukan \(x\), bergantung tentu saja pada jenis matriks yang Anda gunakan:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5mcm9tIHNjaXB5IGltcG9ydCBsaW5hbGdcbkEgPSBucC5tYXRyaXgobnAucmFuZG9tLnJhbmRvbSgoMiwyKSkpXG5hID0gbnAuYXJyYXkoWzEsMiwzXSlcbkUgPSBucC5tYXQoYSkuVFxuYiA9IG5wLmFycmF5KFsoMSs1aiwyaiwzaiksICg0aiw1aiw2aildKVxuRiA9IG5wLmV5ZSgzLCBrPTEpIiwic2FtcGxlIjoiIyBEZW5zZSBtYXRyaXggc29sdmVyXG5saW5hbGcuc29sdmUoQSwgYilcblxuIyBMaW5lYXIgbGVhc3Qtc3F1YXJlIHNvbHZlclxubGluYWxnLmxzdHNxKEYsRSkifQ==

Untuk menyelesaikan matriks sparse, Anda dapat menggunakan linalg.spsolve(). Ketika Anda tidak dapat menyelesaikan persamaan, mungkin masih dimungkinkan untuk memperoleh perkiraan \(x\) dengan bantuan perintah linalg.lstsq().

Tip: jangan lewatkan lembar contekan SciPy dari DataCamp.

Sekarang setelah Anda mendapatkan gambaran tentang cara membuat matriks dan bagaimana menggunakannya untuk operasi matematika, saatnya membahas topik yang lebih lanjut yang Anda perlukan untuk benar-benar masuk ke machine learning.

Nilai dan Vektor Eigen

Topik pertama yang akan Anda bahas adalah nilai dan vektor eigen.

Nilai eigen adalah cara baru untuk melihat ke inti sebuah matriks. Namun sebelum membahas lebih jauh, mari jelaskan terlebih dahulu apa itu vektor eigen. Hampir semua vektor berubah arah ketika dikalikan oleh sebuah matriks. Namun, vektor tertentu yang istimewa hasilnya searah dengan vektor yang merupakan hasil perkalian. Inilah vektor eigen.

Dengan kata lain, kalikan sebuah vektor eigen dengan matriks, maka vektor hasil perkalian tersebut sama dengan perkalian vektor eigen asli dengan \(\lambda\), nilai eigen: \[Ax = \lambda x. \]

Ini berarti nilai eigen memberi Anda informasi yang sangat berharga: ini memberi tahu apakah salah satu vektor eigen diregangkan, diciutkan, dibalik, atau dibiarkan tidak berubah — saat dikalikan oleh matriks.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5pbXBvcnQgc2NpcHlcbmZyb20gc2NpcHkgaW1wb3J0IGxpbmFsZyBcbm15TWF0cml4ID0gbnAubWF0cml4KG5wLnJhbmRvbS5yYW5kb20oKDIsMikpKSIsInNhbXBsZSI6IiMgU29sdmUgZWlnZW52YWx1ZSBwcm9ibGVtXG5sYSwgdiA9IGxpbmFsZy5laWcobXlNYXRyaXgpIFxuXG4jIFVucGFjayBlaWdlbnZhbHVlc1xubDEsIGwyID0gbGFcblxuIyBGaXJzdCBlaWdlbnZlY3Rvclxudls6LDBdXG5cbiMgU2Vjb25kIGVpZ2VudmVjdG9yXG52WzosMV1cblxuIyBPciB1bnBhY2sgZWlnZW52YWx1ZXMgd2l0aCBgZWlndmFscygpYFxubGluYWxnLmVpZ3ZhbHMobXlNYXRyaXgpIn0=

Anda menggunakan fungsi eig() dari modul SciPy linalg untuk menyelesaikan masalah nilai dan vektor eigen biasa atau ters-general untuk matriks persegi.

Perhatikan bahwa fungsi eigvals() adalah cara lain untuk membongkar nilai eigen dari sebuah matriks.

Saat bekerja dengan matriks sparse, Anda dapat kembali ke modul scipy.sparse untuk menyediakan fungsi yang tepat guna menemukan nilai dan vektor eigen:

la, v = sparse.linalg.eigs(myMatrix,1)

Catatan bahwa kode di atas menentukan jumlah nilai dan vektor eigen yang harus diambil, yaitu 1.

Nilai dan vektor eigen adalah konsep penting dalam banyak teknik computer vision dan machine learning, seperti Principal Component Analysis (PCA) untuk reduksi dimensi dan EigenFaces untuk pengenalan wajah.

Singular Value Decomposition (SVD)

Selanjutnya, Anda perlu mengetahui SVD jika ingin benar-benar belajar data science. Singular value decomposition dari sebuah matriks \(A\) adalah dekomposisi atau faktorisasi \(A\) menjadi hasil kali tiga matriks: \(A = U * \Sigma * V^t\).

Ukuran masing-masing matriks adalah sebagai berikut jika Anda tahu bahwa matriks \(A\) berukuran \(M\) x \(N\):

  • Matriks \(U\) berukuran \(M\) x \(M\)
  • Matriks \(V\) berukuran \(N\) x \(N\)
  • Matriks \(\Sigma\) berukuran \(M\) x \(N\)

Tanda \(*\) menunjukkan bahwa matriks dikalikan dan \(^t\) yang Anda lihat pada \(V^t\) berarti matriks ditranspos, yang berarti baris dan kolom dipertukarkan.

Sederhananya, singular value decomposition menyediakan cara untuk memecah sebuah matriks menjadi bagian-bagian yang lebih sederhana dan bermakna. Bagian-bagian ini mungkin berisi sebagian data yang kita minati.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5mcm9tIHNjaXB5IGltcG9ydCBsaW5hbGdcbmIgPSBucC5hcnJheShbKDErNWosMmosM2opLCAoNGosNWosNmopXSlcbm15TWF0cml4ID0gbnAuYXNtYXRyaXgoYikiLCJzYW1wbGUiOiIjIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb25cblUscyxWaCA9IGxpbmFsZy5zdmQobXlNYXRyaXgpIFxuXG4jIEluaXRpYWxpemUgYE1gIGFuZCBgTmBcbk0sTiA9IG15TWF0cml4LnNoYXBlXG5cbiMgQ29uc3RydWN0IHNpZ21hIG1hdHJpeCBpbiBTVkRcblNpZyA9IGxpbmFsZy5kaWFnc3ZkKHMsTSxOKSJ9

Catatan bahwa untuk matriks sparse, Anda dapat menggunakan fungsi sparse.linalg.svds() untuk melakukan dekomposisi.

Jika Anda baru di data science, dekomposisi matriks mungkin cukup tidak jelas: Anda mungkin belum langsung melihat kasus penggunaan untuk menerapkannya. Namun SVD berguna dalam banyak tugas, seperti kompresi data, pengurangan noise, dan analisis data. Berikutnya, Anda akan melihat bagaimana SVD dapat digunakan untuk mengompresi gambar:

# Import the necessary packagesimport numpy as npfrom scipy import linalgfrom skimage import dataimport matplotlib.pyplot as plt# Get an image from `skimage`img= data.camera()# Check number of singular valueslinalg.svdvals(img)# Singular Value DecompositionU, s, Vh = linalg.svd(img)# Use only 32 singular valuesA = np.dot(U[:,0:32],           np.dot(np.diag(s[0:32]), Vh[0:32,:]))fig = plt.figure(figsize=(8, 3))# Add a subplot to the figureax = fig.add_subplot(121)# Plot `img` on grayscaleax.imshow(img, cmap='gray')# Add a second subplot to the figureax2 = fig.add_subplot(122)# Plot `A` in the second subplotax2.imshow(A)# Add a titlefig.suptitle('Image Compression with SVD', fontsize=14, fontweight='bold')# Show the plotplt.show()

Yang akan memberi Anda hasil berikut:


image compression with svd

Pertimbangkan juga contoh-contoh berikut di mana SVD digunakan:

  • SVD sangat terkait dengan Principal Component Analysis (PCA), yang digunakan untuk reduksi dimensi: keduanya menghasilkan sekumpulan “sumbu baru” yang dibangun dari kombinasi linear sumbu ruang fitur dari data Anda. “Sumbu baru” ini menguraikan varians pada titik data berdasarkan kontribusi setiap arah terhadap varians dalam data. Untuk melihat contoh konkret bagaimana PCA bekerja pada data, kunjungi Scikit-Learn Tutorial kami.
  • Kaitan lainnya adalah dengan data mining dan natural language processing (NLP): Latent Semantic Indexing (LSI). Ini adalah teknik yang digunakan dalam pengambilan dokumen dan kemiripan kata. Latent semantic indexing menggunakan SVD untuk mengelompokkan dokumen ke konsep yang dapat terdiri dari kata-kata berbeda yang ditemukan dalam dokumen-dokumen tersebut. Berbagai kata dapat dikelompokkan menjadi sebuah konsep. Di sini juga, SVD mengurangi korelasi berisik antara kata dan dokumennya, dan menurunkan jumlah dimensi yang dimiliki data asli.

Anda lihat, SVD adalah konsep penting dalam perjalanan data science Anda yang harus dipelajari. Itu sebabnya Anda perlu mempertimbangkan untuk mendalami SVD melampaui cakupan tutorial ini: misalnya, kunjungi halaman ini untuk membaca lebih lanjut tentang dekomposisi matriks ini.

Selanjutnya Apa?

Anda telah mencapai akhir tutorial! Ke mana Anda akan melangkah dari sini sepenuhnya terserah Anda.

Tapi tunggu dulu!

Jangan lewatkan kursus yang membahas aljabar linear lebih dalam: tutorial ini hanyalah pengantar topik dan belum mencakup semuanya!

Tentu saja, pertimbangkan juga mengikuti tutorial Machine Learning DataCamp, yang pasti akan menambah nilai pada kurikulum belajar Anda setelah melalui tutorial Scipy tentang aljabar linear ini. Namun, jika Anda ingin kembali ke dasar, telusuri tutorial NumPy kami atau kursus Intermediate Python for Data Science.

Topik
Python
Data Science
Analisis Data

Pelajari lebih lanjut tentang Python

Kursus

Python Tingkat Menengah

4 jam
1.4M
Tingkatkan keterampilan data science Anda dengan membuat visualisasi menggunakan Matplotlib dan memanipulasi DataFrame dengan pandas.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya