25

Mam dwie macierzeJak uzyskać mnożenie macierzy elementów (produkt Hadamarda) w numpy?

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

i chcę, aby uzyskać produkt element mądry, [[1*5,2*6], [3*7,4*8]], zrównując

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

próbowałem

print(np.dot(a,b)) 

i

print(a*b) 

ale oba daje wynik

[[19 22], [43 50]]

który jest produktem matrycy, a nie produkt element mądry. Jak mogę uzyskać produkt zgodny z normami (zwany również produktem Hadamarda) za pomocą wbudowanych funkcji?

+3

Czy na pewno '' B' A' i nie są typu matryca NumPy za? W przypadku tej klasy '*' zwraca wewnętrzny produkt, a nie elementarny. Ale dla zwykłej klasy 'ndarray'' * oznacza produkt elementarny. – bnaecker

+0

to tablice "a" i "b" numpy? Również w powyższym pytaniu używasz 'x' i' y' do obliczeń zamiast 'a' i' b'. Czy to tylko literówka? – jtitusj

+0

aib są elementami numpy matrix type – Malintha

Odpowiedz

35

Spróbuj tego,

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]]) 
+3

Wystarczy dodać trochę kontekstu: w algebrze ta operacja jest znana jako ** Produkt Hadamard ** i różni się od bardziej powszechnego produktu macierzy. https://en.wikipedia.org/wiki/Hadamard_product_(matrices) – FaCoffee

22

po prostu to zrobić:

import numpy as np 

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

a * b 
+1

nop, daje mnożenie macierzy. Chmura rozwiązuje go, używając numpy.hultiply – Malintha

+0

, co jest dziwne. 'np.multiply' może również być w stanie zrobić lewę, ale nie wiem, dlaczego' a * b' nie działa dla ciebie. – jtitusj

+2

Którą wersję i mniejszą wersję Python używasz? A z numpy? – smci

3
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 

Zarówno np.multiply i * przyniesie elementu mądry mul tiplication znany jako produkt Hadamarda

%timeit jest ipython magia

0

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 ndarray i mnożenia dwóch ndarray skutkowałoby elementu mnożenie. Więc wynik będzie:

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

Jeśli chcesz uzyskać matrycowym zrobić z tym:

result = np.mat(result) 
+0

Proszę wyjaśnić, co to robi. –

+1

@LeopoldJoy Właśnie zredagowałem swoją odpowiedź, mam nadzieję, że to pomoże :)) –