Saya baru saja pindah ke Python 3.5 dan melihat operator perkalian matriks baru (@) terkadang berperilaku berbeda dari operator numpy dot . Misalnya, untuk array 3d:
import numpy as np
a = np.random.rand(8,13,13)
b = np.random.rand(8,13,13)
c = a @ b # Python 3.5+
d = np.dot(a, b)
The @
Operator mengembalikan array bentuk:
c.shape
(8, 13, 13)
sementara np.dot()
fungsinya kembali:
d.shape
(8, 13, 8, 13)
Bagaimana cara mereproduksi hasil yang sama dengan numpy dot? Apakah ada perbedaan signifikan lainnya?
matmul
fungsi tersebut bertahun-tahun yang lalu?@
sebagai operator infix baru, tetapi fungsinya bekerja dengan baik tanpanya.Jawaban:
The
@
Operator menyebut array__matmul__
metode, tidakdot
. Metode ini juga ada di API sebagai fungsinyanp.matmul
.Dari dokumentasi:
Poin terakhir memperjelas bahwa
dot
danmatmul
metode berperilaku berbeda ketika melewati array 3D (atau dimensi yang lebih tinggi). Mengutip dari dokumentasi lagi:Untuk
matmul
:Untuk
np.dot
:sumber
Jawaban oleh @ajcr menjelaskan bagaimana
dot
danmatmul
(dipanggil oleh@
simbol) berbeda. Dengan melihat contoh sederhana, kita dapat melihat dengan jelas bagaimana keduanya berperilaku berbeda saat beroperasi pada 'tumpukan matriks' atau tensor.Untuk memperjelas perbedaan, ambil larik 4x4 dan kembalikan
dot
produk danmatmul
produk dengan 'tumpukan matriks' atau tensor 3x4x2.Produk dari setiap operasi muncul di bawah. Perhatikan bagaimana perkalian titiknya,
dan bagaimana produk matriks dibentuk dengan menyiarkan matriks bersama-sama.
sumber
a = np.arange(24).reshape(3, 4, 2)
membuat array dengan dimensi 3x4x2.FYI saja,
@
dan numpy-nya setaradot
danmatmul
semuanya kira-kira sama cepatnya. (Plot dibuat dengan perfplot , proyek saya.)Kode untuk mereproduksi plot:
sumber
Dalam matematika, menurut saya titik di numpy lebih masuk akal
karena memberikan perkalian titik jika a dan b adalah vektor, atau perkalian matriks jika a dan b adalah matriks
Adapun operasi matmul dalam numpy terdiri dari bagian-bagian hasil titik , dan dapat didefinisikan sebagai
> matmul (a, b) _ {i, j, k, c} =
Jadi, Anda dapat melihat bahwa matmul (a, b) mengembalikan array dengan bentuk kecil, yang memiliki konsumsi memori lebih kecil dan lebih masuk akal dalam aplikasi. Secara khusus, menggabungkan dengan penyiaran , Anda bisa mendapatkan
sebagai contoh.
Dari dua definisi di atas, Anda dapat melihat persyaratan untuk menggunakan kedua operasi tersebut. Asumsikan a.shape = (s1, s2, s3, s4) and b.shape = (t1, t2, t3, t4)
Untuk menggunakan titik (a, b) yang Anda butuhkan
Untuk menggunakan matmul (a, b) yang Anda butuhkan
Gunakan potongan kode berikut untuk meyakinkan diri Anda sendiri.
Contoh kode
sumber
np.matmul
juga memberikan perkalian titik pada vektor dan produk matriks pada matriks.Berikut adalah perbandingan dengan
np.einsum
untuk menunjukkan bagaimana indeks diproyeksikansumber
Pengalaman saya dengan MATMUL dan DOT
Saya terus-menerus mendapatkan "ValueError: Bentuk nilai yang diteruskan adalah (200, 1), indeks menyiratkan (200, 3)" saat mencoba menggunakan MATMUL. Saya ingin solusi cepat dan menemukan DOT memberikan fungsi yang sama. Saya tidak mendapatkan kesalahan apa pun saat menggunakan DOT. Saya mendapatkan jawaban yang benar
dengan MATMUL
dengan DOT
sumber