Apa kelebihan dan kekurangan masing-masing?
Dari apa yang saya lihat, salah satu dapat berfungsi sebagai pengganti yang lain jika perlu, jadi haruskah saya repot menggunakan keduanya atau haruskah saya tetap berpegang pada salah satu saja?
Apakah gaya program mempengaruhi pilihan saya? Saya melakukan beberapa pembelajaran mesin menggunakan numpy, jadi memang ada banyak matriks, tetapi juga banyak vektor (array).
A @ B
alih-alihA.dot(B)
, di manaA
danB
2Dndarray
s. Ini menghilangkan keuntungan utama menggunakanmatrix
bukanndarray
s polos , IMHO.Jawaban:
Sesuai dokumen resmi, tidak lagi disarankan untuk menggunakan kelas matriks karena akan dihapus di masa depan.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Sebagai jawaban lain sudah menyatakan bahwa Anda dapat mencapai semua operasi dengan array NumPy.
sumber
Matriks numpy benar-benar 2 dimensi, sedangkan numpy array (ndarrays) adalah N-dimensional. Objek matriks adalah subkelas dari ndarray, sehingga mereka mewarisi semua atribut dan metode ndarray.
Keuntungan utama dari matriks numpy adalah bahwa mereka memberikan notasi yang nyaman untuk perkalian matriks: jika a dan b adalah matriks, maka
a*b
adalah produk matriks mereka.Di sisi lain, pada Python 3.5, NumPy mendukung perkalian matriks infiks menggunakan
@
operator, sehingga Anda dapat mencapai kenyamanan yang sama dari perkalian matriks dengan ndarrays di Python> = 3.5.Objek matriks dan ndarrays harus
.T
mengembalikan transpos, tetapi objek matriks juga memiliki.H
transpos konjugat, dan.I
untuk invers.Sebaliknya, numpy array secara konsisten mematuhi aturan bahwa operasi diterapkan berdasarkan elemen (kecuali untuk
@
operator baru ). Dengan demikian, jikaa
danb
array numpy, makaa*b
array dibentuk dengan mengalikan elemen-elemen komponen:Untuk mendapatkan hasil perkalian matriks, Anda menggunakan
np.dot
(atau@
dengan Python> = 3.5, seperti yang ditunjukkan di atas):The
**
Operator juga berperilaku berbeda:Karena
a
merupakan matriks,a**2
kembalikan produk matriksa*a
. Karenac
merupakan ndarray,c**2
mengembalikan ndarray dengan setiap komponen yang dikuadratkan dengan elemen.Ada perbedaan teknis lainnya antara objek matriks dan ndarrays (berkaitan dengan
np.ravel
, pemilihan item dan perilaku urutan).Keuntungan utama dari array numpy adalah bahwa mereka lebih umum daripada matriks 2 dimensi . Apa yang terjadi ketika Anda menginginkan array 3 dimensi? Maka Anda harus menggunakan ndarray, bukan objek matriks. Dengan demikian, belajar menggunakan objek matriks lebih banyak pekerjaan - Anda harus belajar operasi objek matriks, dan operasi ndarray.
Menulis program yang menggabungkan matriks dan array membuat hidup Anda sulit karena Anda harus melacak jenis objek variabel Anda, jangan sampai perkalian mengembalikan sesuatu yang tidak Anda harapkan.
Sebaliknya, jika Anda hanya menggunakan ndarrays, maka Anda dapat melakukan semua yang dapat dilakukan objek matriks, dan lebih banyak lagi, kecuali dengan fungsi / notasi yang sedikit berbeda.
Jika Anda bersedia untuk melepaskan daya tarik visual dari notasi produk NumPy matrix (yang dapat dicapai hampir sama anggunnya dengan ndarrays dengan Python> = 3.5), maka saya pikir array NumPy jelas merupakan cara yang harus dilakukan.
PS. Tentu saja, Anda benar-benar tidak harus memilih satu dengan mengorbankan yang lain, karena
np.asmatrix
dannp.asarray
memungkinkan Anda untuk mengkonversi satu ke yang lain (selama array 2-dimensi).Ada sinopsis dari perbedaan antara NumPy
arrays
vs NumPymatrix
es di sini .sumber
mat**n
untuk sebuah matriks dapat diterapkan secara tidakreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
lebih cepat daripadamatrix1*matrix2
. Ini masuk akal karenamatrix
merupakan subclass dari ndarray yang menimpa metode khusus seperti__mul__
.matrix.__mul__
panggilannp.dot
. Jadi ada penggunaan kembali kode di sini. Alih-alih melakukan lebih sedikit pemeriksaan, menggunakanmatrix*matrix
membutuhkan panggilan fungsi tambahan. Jadi keuntungan menggunakanmatrix
sintaksis murni, bukan kinerja yang lebih baik.Scipy.org merekomendasikan agar Anda menggunakan array:
sumber
ndarray
. Argumen utama untuk menggunakanmatrix
akan jika kode Anda berat dalam aljabar linier dan akan terlihat kurang jelas dengan semua panggilan kedot
fungsi. Tapi argumen ini akan hilang di masa depan, sekarang @ -operator diterima untuk digunakan dengan perkalian matriks, lihat PEP 465 . Ini akan membutuhkan Python 3.5 dan versi terbaru Numpy. Kelas matriks mungkin sudah ditinggalkan jauh di masa depan, jadi lebih baik menggunakan ndarray untuk kode baru ...scipy.sparse
matriks. Jika Anda menggunakan matriks padat & jarang dalam kode Anda, itu jauh lebih mudah untuk dipatuhimatrix
.Hanya dengan menambahkan satu case ke daftar unutbu.
Salah satu perbedaan praktis terbesar bagi saya ndarrays numpy dibandingkan dengan matriks numpy atau bahasa matriks seperti matlab, adalah bahwa dimensi tidak dipertahankan dalam mengurangi operasi. Matriks selalu 2d, sedangkan rata-rata array, misalnya, memiliki satu dimensi lebih sedikit.
Misalnya, merendahkan baris matriks atau array:
dengan matriks
dengan array
Saya juga berpikir bahwa mencampur array dan matriks memunculkan banyak jam debug yang "bahagia". Namun, matriks scipy.sparse selalu matriks dalam hal operator seperti perkalian.
sumber
Seperti yang telah disebutkan orang lain, mungkin keuntungan utama
matrix
adalah memberikan notasi yang nyaman untuk perkalian matriks.Namun, di Python 3.5 akhirnya ada operator infiks khusus untuk perkalian matriks :
@
.Dengan versi NumPy terbaru, ini dapat digunakan dengan
ndarray
s:Jadi saat ini, bahkan lebih, ketika ragu, Anda harus tetap melakukannya
ndarray
.sumber