Dokumen numpy merekomendasikan penggunaan array daripada matriks untuk bekerja dengan matriks. Namun, tidak seperti oktaf (yang saya gunakan sampai saat ini), * tidak melakukan perkalian matriks, Anda perlu menggunakan fungsi matrixmultipy (). Saya merasa ini membuat kode sangat tidak terbaca.
Apakah ada yang berbagi pandangan saya, dan telah menemukan solusi?
.*
sintaks vs '*' untuk perkalian elemen vs matriks. Jika sudah demikian maka semuanya akan lebih sederhana meskipun saya terkejut mereka memilih*
untuk berarti elemen-bijaksana dan bukan perkalian matriks.Jawaban:
Alasan utama untuk menghindari penggunaan
matrix
kelas adalah bahwa a) itu secara inheren 2 dimensi, dan b) ada overhead tambahan dibandingkan dengan array numpy "normal". Jika semua yang Anda lakukan adalah aljabar linier, maka tentu saja, jangan ragu untuk menggunakan kelas matriks ... Secara pribadi saya merasa lebih banyak kesulitan daripada nilainya.Untuk array (sebelum Python 3.5), gunakan
dot
sebagai gantimatrixmultiply
.Misalnya
Atau dalam versi numpy yang lebih baru, cukup gunakan
x.dot(y)
Secara pribadi, saya merasa lebih mudah dibaca daripada
*
operator yang menyiratkan perkalian matriks ...Untuk array dalam Python 3.5, gunakan
x @ y
.sumber
x.T.dot(A.T).dot(A).dot(x)
bukankah itu tidak bisa dibaca, imo Untuk masing-masing miliknya sendiri. Jika Anda terutama melakukan perkalian matriks, maka tentu saja, gunakannumpy.matrix
!numpy.matrixmultiply
sulit untuk diketik.numpy.dot
setara dengan perkalian matriks. Jika Anda benar-benar tidak menyukai notasi, gunakanmatrix
kelas.hal-hal utama yang perlu diketahui untuk operasi pada array NumPy versus operasi pada matriks NumPy adalah:
Matriks NumPy adalah subkelas dari array NumPy
Operasi array NumPy adalah elemen-bijaksana (setelah penyiaran diperhitungkan)
Operasi matriks NumPy mengikuti aturan biasa dari aljabar linier
beberapa cuplikan kode untuk diilustrasikan:
tetapi operasi ini gagal jika dua matriks NumPy ini dikonversi menjadi array:
meskipun menggunakan sintaks NP.dot bekerja dengan array ; operasi ini bekerja seperti perkalian matriks:
jadi apakah Anda pernah membutuhkan matriks NumPy? yaitu, apakah array NumPy cukup untuk perhitungan aljabar linier (asalkan Anda tahu sintaks yang benar, yaitu, NP.dot)?
aturan tampaknya bahwa jika argumen (array) memiliki bentuk (mxn) yang kompatibel dengan operasi aljabar linier yang diberikan, maka Anda ok, jika tidak, NumPy melempar.
satu-satunya pengecualian yang saya temui (ada kemungkinan yang lain) menghitung invers matriks .
di bawah ini adalah potongan-potongan yang saya sebut operasi aljabar linier murni (sebenarnya, dari modul Aljabar Linear Numpy) dan dilewatkan dalam array NumPy
penentu array:
pasangan vektor eigen / nilai eigen :
norma matriks :
faktorisasi qr :
peringkat matriks :
kondisi matriks :
inversi membutuhkan matriks NumPy:
tetapi pseudoinverse Moore-Penrose tampaknya bekerja dengan baik
sumber
Pada 3.5, Python akhirnya mendapat operator perkalian matriks . Sintaksnya adalah
a @ b
.sumber
Ada situasi di mana operator titik akan memberikan jawaban yang berbeda ketika berhadapan dengan array seperti halnya berurusan dengan matriks. Misalnya, anggap sebagai berikut:
Mari kita ubah menjadi matriks:
Sekarang, kita dapat melihat output yang berbeda untuk dua kasus:
sumber
Referensi dari http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
..., penggunaan kelas numpy.matrix tidak disarankan , karena tidak menambahkan apa pun yang tidak dapat dilakukan dengan objek numpy.ndarray 2D , dan dapat menyebabkan kebingungan tentang kelas mana yang sedang digunakan. Sebagai contoh,
operasi scipy.linalg dapat diterapkan secara merata pada objek numpy.matrix atau 2D numpy.ndarray .
sumber
Trik ini bisa jadi apa yang Anda cari. Ini adalah semacam kelebihan operator yang sederhana.
Anda kemudian dapat menggunakan sesuatu seperti kelas Infix yang disarankan seperti ini:
sumber
Kutipan terkait dari PEP 465 - Operator infiks khusus untuk perkalian matriks , sebagaimana disebutkan oleh @ petr-viktorin, mengklarifikasi masalah yang dihadapi OP:
Pengenalan
@
operator infiks harus membantu menyatukan dan menyederhanakan kode matriks python.sumber
Fungsi matmul (karena numpy 1.10.1) berfungsi dengan baik untuk kedua jenis dan mengembalikan hasil sebagai kelas matriks numpy:
Keluaran:
Sejak python 3.5 seperti yang disebutkan sebelumnya Anda juga dapat menggunakan operator perkalian matriks baru
@
sepertidan dapatkan hasil yang sama seperti di atas.
sumber