Jak uzyskać mnożenie macierzy z uwzględnieniem elementów (iloczyn Hadamarda) w numpy?


104

Mam dwie matryce

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

i chcę uzyskać iloczyn elementarny [[1*5,2*6], [3*7,4*8]]równy

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

próbowałem

print(np.dot(a,b)) 

i

print(a*b)

ale oba dają wynik

[[19 22], [43 50]]

który jest iloczynem macierzy, a nie iloczynem elementarnym. Jak mogę uzyskać produkt elementarny (znany również jako produkt Hadamarda) za pomocą wbudowanych funkcji?


4
Czy na pewno ai bnie jest to typ macierzy NumPy? W przypadku tej klasy *zwraca iloczyn skalarny, a nie elementarny. Ale dla zwykłej ndarrayklasy *oznacza produkt elementarny.
bnaecker

są tablice ai bnumpy? Ponadto w swoim pytaniu powyżej używasz xi ydo obliczeń zamiast ai b. Czy to tylko literówka?
jtitusj

a i b to elementy typu numpy typu matrix
Malintha,

8
Zawsze używaj numpy tablic, a nie numpy macierzy. Zobacz, co mówią na ten temat numpy doktorzy . Zauważ również, że od Pythona 3.5+ możesz używać @do mnożenia macierzy za pomocą tablic numpy, co oznacza, że ​​nie powinno być absolutnie żadnego powodu, aby używać macierzy zamiast tablic.
Praveen

3
Być wybrednym ai bbyć listami. Będą pracować np.dot; ale nie w a*b. Jeśli używasz np.array(a)lub np.matrix(a), *działa, ale z innymi wynikami.
hpaulj

Odpowiedzi:


156

Do elementarnego mnożenia matrixobiektów możesz użyć numpy.multiply:

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

Wynik

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

Jednak naprawdę powinieneś używać arrayzamiast matrix. matrixobiekty mają różnego rodzaju okropne niezgodności ze zwykłymi ndarrayami. Z ndarrays, możesz po prostu użyć *do mnożenia elementów:

a * b

Jeśli korzystasz z Pythona 3.5+, nie tracisz nawet możliwości wykonywania mnożenia macierzy za pomocą operatora, ponieważ @teraz robi to mnożenie macierzy :

a @ b  # matrix multiplication

12
Żeby dodać trochę kontekstu: w algebrze ta operacja jest znana jako iloczyn Hadamarda i różni się od bardziej powszechnego iloczynu macierzy. pl.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee

36

po prostu zrób to:

import numpy as np

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

a * b

1
nie, daje mnożenie macierzy. Chmura rozwiązuje to za pomocą numpy.multiply
Malintha

2
Której wersji i pomniejszej wersji Pythona używasz? A odrętwienie?
smci

1
Używając Intel Python 3.5.2 z numpy 1.12.1, *operator wydaje się wykonywać mnożenie według elementów.
apnorton

1
Działa to również dla mnie z Numpy 1.12.1 na Pythonie 3.5.2 (zbudowanym przy użyciu gcc).
Autodidact

6
@Malintha, myślę, że zamiast tego robisz a = 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

Oba np.multiplyi *dałyby mądre mnożenie elementów znane jako Produkt Hadamarda

%timeit to magia ipython


1

Spróbuj tego:

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)

Tutaj np.array(a)zwraca tablicę 2D typu, ndarraya pomnożenie dwóch ndarrayspowoduje pomnożenie elementów. Wynik byłby więc:

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

Jeśli chcesz zdobyć matrycę, zrób to za pomocą tego:

result = np.mat(result)

Proszę wyjaśnij, co to robi.
Leopold Joy

2
@LeopoldJoy Właśnie zredagowałem odpowiedź, mam nadzieję, że to pomoże :))
Amir Rezazadeh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.