Bagaimana cara mendapatkan perkalian matriks elemen-bijaksana (produk Hadamard) di numpy?


102

Saya memiliki dua matriks

a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])

dan saya ingin mendapatkan produk elemen-bijaksana [[1*5,2*6], [3*7,4*8]],, setara

[[5,12], [21,32]]

saya telah mencoba

print(np.dot(a,b)) 

dan

print(a*b)

tapi keduanya memberikan hasil

[[19 22], [43 50]]

yang merupakan hasil kali matriks, bukan produk bijak. Bagaimana saya bisa mendapatkan produk elemen-bijaksana (alias produk Hadamard) menggunakan fungsi bawaan?


4
Apakah Anda yakin adan bbukan tipe matriks NumPy? Dengan kelas ini, *mengembalikan produk dalam, bukan elemen-bijaksana. Tetapi untuk ndarraykelas biasa , *berarti produk yang bijak.
bnaecker

are adan barray numpy? Juga, dalam pertanyaan Anda di atas, Anda menggunakan xdan yuntuk komputasi, bukan adan b. Apakah itu hanya salah ketik?
jtitusj

a dan b adalah elemen tipe matriks numpy
Malintha

8
Selalu gunakan array numpy, dan bukan matriks numpy. Lihat apa yang dikatakan dokumen numpy tentang ini. Perhatikan juga bahwa dari python 3.5+, Anda dapat menggunakan @perkalian matriks dengan larik numpy, yang berarti sama sekali tidak ada alasan yang baik untuk menggunakan matriks di atas larik.
Praveen

3
Untuk menjadi pilih-pilih, adan bdaftar. Mereka akan bekerja di np.dot; tapi tidak di a*b. Jika Anda menggunakan np.array(a)atau np.matrix(a), *berfungsi tetapi dengan hasil yang berbeda.
hpaulj

Jawaban:


154

Untuk perkalian elementwise dari matrixobjek, Anda dapat menggunakan numpy.multiply:

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.multiply(a,b)

Hasil

array([[ 5, 12],
       [21, 32]])

Namun, Anda harus benar-benar menggunakan arraybukan matrix. matrixbenda memiliki segala macam ketidaksesuaian yang mengerikan dengan ndarrays biasa. Dengan ndarrays, Anda hanya dapat menggunakan *untuk perkalian elementwise:

a * b

Jika Anda menggunakan Python 3.5+, Anda bahkan tidak kehilangan kemampuan untuk melakukan perkalian matriks dengan operator, karena @sekarang perkalian matriks :

a @ b  # matrix multiplication

11
Hanya untuk menambahkan sedikit konteks: dalam Aljabar, operasi ini dikenal sebagai Produk Hadamard , dan ini berbeda dari produk matriks yang lebih umum. en.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee

36

lakukan saja ini:

import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])

a * b

1
tidak, ini memberikan perkalian matriks. Cloud menyelesaikannya menggunakan numpy.multiply
Malintha

2
Versi dan versi minor apa dari Python yang Anda gunakan? Dan numpy?
smci

1
Menggunakan Intel Python 3.5.2 dengan numpy 1.12.1, *operator tampaknya melakukan perkalian elemen-bijaksana.
apnorton

1
Ini berfungsi untuk saya dengan Numpy 1.12.1 pada Python 3.5.2 (dibuat menggunakan gcc) juga.
Autodidak

6
@Malintha, saya pikir Anda melakukan a = np. ** matrix ** ([[1,2], [3,4]]) sebagai gantinya
SeF

11
import numpy as np
x = np.array([[1,2,3], [4,5,6]])
y = np.array([[-1, 2, 0], [-2, 5, 1]])

x*y
Out: 
array([[-1,  4,  0],
       [-8, 25,  6]])

%timeit x*y
1000000 loops, best of 3: 421 ns per loop

np.multiply(x,y)
Out: 
array([[-1,  4,  0],
       [-8, 25,  6]])

%timeit np.multiply(x, y)
1000000 loops, best of 3: 457 ns per loop

Keduanya np.multiplydan *akan menghasilkan perkalian bijak yang dikenal sebagai Produk Hadamard

%timeit adalah sihir ipython


1

Coba ini:

a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])

#This would result a 'numpy.ndarray'
result = np.array(a) * np.array(b)

Di sini, np.array(a)mengembalikan tipe array 2D ndarraydan perkalian dua ndarrayakan menghasilkan perkalian bijak elemen. Jadi hasilnya adalah:

result = [[5, 12], [21, 32]]

Jika Anda ingin mendapatkan matriks, lakukan dengan ini:

result = np.mat(result)

Tolong jelaskan apa fungsinya.
Leopold Joy

2
@LeopoldJoy Saya baru saja mengedit jawaban saya, semoga ini membantu :))
Amir Rezazadeh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.