25

У меня есть две матрицыКак получить элементарное умножение матрицы (продукт Адамара) в numpy?

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

, и я хочу, чтобы получить поэлементное продукт, [[1*5,2*6], [3*7,4*8]], сравнявшись

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

Я попытался

print(np.dot(a,b)) 

и

print(a*b) 

но оба дают результат

[[19 22], [43 50]]

, который является матрицей продукта, а не поэлементно продукт. Как я могу получить элементный продукт (например, продукт Hadamard), используя встроенные функции?

+3

Вы уверены, что 'a' и' b' не матричного типа Numpy в? С этим классом '*' возвращает внутренний продукт, а не элементный. Но для обычного класса 'ndarray',' * 'означает элементный продукт. – bnaecker

+0

- массивы 'a' и' b' numpy? Кроме того, в вашем вопросе выше вы используете 'x' и' y' для вычислений вместо 'a' и' b'. Это просто опечатка? – jtitusj

+0

a и b являются элементами матричного типа num – Malintha

ответ

35

Попробуйте это,

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

Результат

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

Просто добавьте немного контекста: в алгебре эта операция известна как ** Hadamard Product **, и он отличается от более распространенного матричного продукта. https://en.wikipedia.org/wiki/Hadamard_product_(matrices) – FaCoffee

22

просто сделать это:

import numpy as np 

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

a * b 
+1

nop, он дает матричное умножение. Облако разрешает его с помощью numpy.multiply – Malintha

+0

, это странно. 'np.multiply' также мог бы сделать трюк, но я не знаю, почему' a * b' не работает для вас. – jtitusj

+2

Какую версию и младшую версию Python вы используете? И из 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 

Оба np.multiply и * выход будет поэлементно мул tiplication известный как Адамара продукт

%timeit является IPython магия

0

Попробуйте это:

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) 

Здесь np.array(a) возвращает 2D массив типа ndarray и умножения двух ndarray приведет поэлементно умножение. Таким образом, результат будет:

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

Если вы хотите получить матрицу, то сделать это с этим:

result = np.mat(result) 
+0

Пожалуйста, объясните, что это делает. –

+1

@LeopoldJoy Я только что отредактировал свой ответ, надеюсь, что это поможет :)) –