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


105

У меня две матрицы

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]]

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


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

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

a и b - элементы матричного типа numpy
Малинта

8
Всегда используйте массивы numpy, а не матрицы numpy. Посмотрите, что об этом говорят неуклюжие документы . Также обратите внимание, что из python 3.5+ вы можете использовать @для умножения матриц с множеством массивов, что означает, что не должно быть абсолютно никаких причин для использования матриц над массивами.
Praveen

3
Придирчивы aи bсоставляют списки. Они будут работать np.dot; но не в a*b. Если вы используете np.array(a)или np.matrix(a), *работает, но с другими результатами.
hpaulj

Ответы:


156

Для поэлементного умножения matrixобъектов можно использовать numpy.multiply:

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

Однако вам действительно стоит использовать arrayвместо matrix. matrixобъекты имеют ужасную несовместимость с обычными ndarrays. С ndarrays вы можете просто использовать *для поэлементного умножения:

a * b

Если вы используете Python 3.5+, вы даже не потеряете возможность выполнять умножение матриц с помощью оператора, потому @что умножение матриц выполняется сейчас :

a @ b  # matrix multiplication

12
Просто чтобы добавить немного контекста: в алгебре эта операция известна как произведение Адамара и отличается от более распространенного матричного произведения. en.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee

36

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

import numpy as np

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

a * b

1
nop, это дает матричное умножение. Облако решает это с помощью numpy.multiply
Малинта

2
Какую версию и дополнительную версию Python вы используете? А тупой?
smci

1
Используя Intel Python 3.5.2 с numpy 1.12.1, *оператор выполняет поэлементное умножение.
apnorton 06

1
Это работает для меня с Numpy 1.12.1 на Python 3.5.2 (построенном с использованием gcc).
Autodidact

6
@Malintha, я думаю, вы вместо этого делаете 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

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

%timeit это магия ipython


1

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

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)

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

2
@LeopoldJoy Я только что отредактировал свой ответ, надеюсь, это поможет :))
Амир Резазаде
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.