Dalam numpy, saya memiliki dua "array", X
adalah (m,n)
dan y
merupakan vektor(n,1)
menggunakan
X*y
Saya mendapatkan kesalahan
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
Kapan (97,2)x(2,1)
jelas operasi matriks hukum dan harus memberi saya (97,1)
vektor
EDIT:
Saya telah mengoreksi ini menggunakan X.dot(y)
tetapi pertanyaan asli masih ada.
X*y
seharusnya tidak bekerja (dan tidak), tetapinp.dot(X,y)
danX.dot(y))
harus berhasil (dan bagi saya mereka berhasil).*
bukan perkalian matriks untukndarray
objek.Jawaban:
dot
adalah perkalian matriks, tetapi*
melakukan hal lain.Kami memiliki dua array:
X
, bentuk (97,2)y
, bentuk (2,1)Dengan array Numpy, operasinya
dilakukan berdasarkan elemen, tetapi satu atau kedua nilai dapat diperluas dalam satu atau beberapa dimensi untuk membuatnya kompatibel. Operasi ini disebut penyiaran. Dimensi dengan ukuran 1 atau yang hilang dapat digunakan dalam penyiaran.
Dalam contoh di atas dimensi tidak sesuai, karena:
Di sini ada angka-angka yang saling bertentangan di dimensi pertama (97 dan 2). Itulah yang dikeluhkan ValueError di atas. Dimensi kedua akan baik-baik saja, karena nomor 1 tidak bertentangan dengan apa pun.
Untuk informasi lebih lanjut tentang aturan penyiaran: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Perlu diketahui bahwa jika
X
dany
bertipenumpy.matrix
, maka tanda bintang dapat digunakan sebagai perkalian matriks. Rekomendasi saya adalah menjauhinumpy.matrix
, ini cenderung mempersulit lebih dari sekedar menyederhanakan.)Array Anda harus baik-baik saja dengan
numpy.dot
; jika Anda mendapatkan kesalahannumpy.dot
, Anda pasti memiliki bug lain. Jika bentuknya salahnumpy.dot
, Anda mendapatkan pengecualian yang berbeda:Jika Anda masih mendapatkan kesalahan ini, harap posting contoh masalah minimal. Contoh perkalian dengan array berbentuk seperti milik Anda berhasil:
sumber
Per dokumen numpy :
Dengan kata lain, jika Anda mencoba mengalikan dua matriks (dalam pengertian aljabar linier) maka Anda menginginkannya,
X.dot(y)
tetapi jika Anda mencoba untuk menyiarkan skalar dari matriksy
ke,X
maka Anda perlu melakukanX * y.T
.Contoh:
sumber
Mungkin saja kesalahan tidak terjadi pada produk titik, tetapi setelahnya. Misalnya coba ini
np.dot (a, b) akan baik-baik saja; Namun np.dot (a, b) * c jelas salah (12x1 X 1x5 = 12x5 yang tidak dapat mengalikan elemen 5x12) tetapi numpy akan memberi Anda
Kesalahannya menyesatkan; namun ada masalah di jalur itu.
sumber
Gunakan
np.mat(x) * np.mat(y)
, itu akan berhasil.sumber
Anda sedang mencari
np.matmul(X, y)
. Dengan Python 3.5+, Anda dapat menggunakanX @ y
.sumber
Kita mungkin bingung sendiri bahwa a * b adalah perkalian titik.
Tapi nyatanya, itu disiarkan.
Produk titik : Perkalian Titik a.dot (b)
Siaran:
(m, n) + - / * (1, n) → (m, n): operasi akan diterapkan ke m baris
sumber