Wie bekomme ich eine elementweise Matrixmultiplikation (Hadamard-Produkt) in Numpy?

102

Ich habe zwei Matrizen

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

und ich möchte das elementweise Produkt [[1*5,2*6], [3*7,4*8]]gleich bekommen

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

Ich habe versucht

print(np.dot(a,b)) 

und

print(a*b)

aber beide geben das Ergebnis

[[19 22], [43 50]]

Das ist das Matrixprodukt, nicht das elementweise Produkt. Wie kann ich das elementweise Produkt (auch bekannt als Hadamard-Produkt) mithilfe integrierter Funktionen erhalten?

Malintha
quelle
4
Sind Sie sicher aund bnicht NumPys Matrixtyp? Gibt mit dieser Klasse *das innere Produkt zurück, nicht elementweise. Aber für die übliche ndarrayKlasse *bedeutet elementartiges Produkt.
Bnaecker
sind aund bnumpy Arrays? In Ihrer obigen Frage verwenden Sie außerdem xund yzur Berechnung anstelle von aund b. Ist das nur ein Tippfehler?
jtitusj
a und b sind numpy Matrix Typ Elemente
Malintha
8
Verwenden Sie immer Numpy-Arrays und keine Numpy-Matrizen. Sehen Sie, was die numpy-Dokumente dazu sagen . Beachten Sie auch, dass Sie ab Python 3.5+ die @Matrixmultiplikation mit Numpy-Arrays verwenden können. Dies bedeutet, dass es absolut keinen guten Grund geben sollte, Matrizen über Arrays zu verwenden.
Praveen
3
Um wählerisch zu sein, aund bsind Listen. Sie werden arbeiten in np.dot; aber nicht in a*b. Wenn Sie np.array(a)oder verwenden np.matrix(a), *funktioniert dies jedoch mit unterschiedlichen Ergebnissen.
hpaulj

Antworten:

153

Für die elementweise Multiplikation von matrixObjekten können Sie Folgendes verwenden numpy.multiply:

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

Ergebnis

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

Sie sollten jedoch wirklich arrayanstelle von verwenden matrix. matrixObjekte haben alle möglichen schrecklichen Inkompatibilitäten mit normalen Ndarrays. Mit ndarrays können Sie nur die *elementweise Multiplikation verwenden:

a * b

Wenn Sie mit Python 3.5+ arbeiten, verlieren Sie nicht einmal die Fähigkeit, eine Matrixmultiplikation mit einem Operator durchzuführen, da @die Matrixmultiplikation jetzt funktioniert :

a @ b  # matrix multiplication
Rahul KP
quelle
11
Nur um einen kleinen Kontext hinzuzufügen: In der Algebra wird diese Operation als Hadamard-Produkt bezeichnet und unterscheidet sich von dem allgemeineren Matrixprodukt. en.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee
36

mach das einfach:

import numpy as np

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

a * b
jtitusj
quelle
1
Nein, es gibt die Matrixmultiplikation. Cloud lösen Sie es mit numpy.multiply
Malintha
2
Welche Version und Nebenversion von Python verwenden Sie? Und von Numpy?
smci
1
Bei Verwendung von Intel Python 3.5.2 mit numpy 1.12.1 *scheint der Operator eine elementweise Multiplikation durchzuführen .
Apnorton
1
Dies funktioniert bei mir auch mit Numpy 1.12.1 unter Python 3.5.2 (erstellt mit gcc).
Autodidact
6
@ Malintha, ich denke du machst stattdessen eine = np. ** Matrix ** ([[1,2], [3,4]])
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

Beides np.multiplyund *würde eine elementweise Multiplikation ergeben, die als Hadamard-Produkt bekannt ist

%timeit ist Ipython Magie

4rshdeep
quelle
1

Versuche dies:

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)

Hier wird np.array(a)ein 2D-Array vom Typ zurückgegeben, ndarrayund eine Multiplikation von zwei ndarraywürde zu einer elementweisen Multiplikation führen. Das Ergebnis wäre also:

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

Wenn Sie eine Matrix erhalten möchten, gehen Sie folgendermaßen vor:

result = np.mat(result)
Amir Rezazadeh
quelle
Bitte erläutern Sie, was dies bewirkt.
Leopold Joy
2
@LeopoldJoy Ich habe gerade meine Antwort bearbeitet, hoffe das hilft :))
Amir Rezazadeh