Como obter a multiplicação da matriz elemento a elemento (produto Hadamard) em numpy?


102

Eu tenho duas matrizes

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

e eu quero obter o produto com base em elementos [[1*5,2*6], [3*7,4*8]], igualando

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

eu tentei

print(np.dot(a,b)) 

e

print(a*b)

mas ambos dão o resultado

[[19 22], [43 50]]

que é o produto da matriz, não o produto do elemento sábio. Como posso obter o produto element-wise (também conhecido como produto Hadamard) usando funções integradas?


4
Tem certeza ae bnão é o tipo de matriz do NumPy? Com esta classe, *retorna o produto interno, não a nível de elemento. Mas para a ndarrayclasse normal , *significa produto com base no elemento.
bnaecker

são ae bmatrizes entorpecidas? Além disso, em sua pergunta acima, você está usando xe ypara cálculo em vez de ae b. Isso é apenas um erro de digitação?
jtitusj

a e b são elementos do tipo matriz numpy
Malintha

8
Sempre use matrizes numpy, e não matrizes numpy. Veja o que os médicos entediantes dizem sobre isso. Observe também que a partir do python 3.5+, você pode usar @para multiplicação de matrizes com arrays numpy, o que significa que não deve haver absolutamente nenhuma boa razão para usar matrizes em vez de arrays.
Praveen

3
Ser exigente ae blistas. Eles vão trabalhar np.dot; mas não dentro a*b. Se você usar np.array(a)ou np.matrix(a), *funciona , mas com resultados diferentes.
hpaulj

Respostas:


154

Para a multiplicação elementar de matrixobjetos, você pode usar numpy.multiply:

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

Resultado

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

No entanto, você realmente deve usar em arrayvez de matrix. matrixobjetos têm todos os tipos de incompatibilidades horríveis com ndarrays regulares. Com ndarrays, você pode usar apenas *para multiplicação de elemento:

a * b

Se você estiver no Python 3.5+, você nem mesmo perderá a capacidade de realizar a multiplicação da matriz com um operador, porque @a multiplicação da matriz agora :

a @ b  # matrix multiplication

11
Só para adicionar um pouco de contexto: em Álgebra, essa operação é conhecida como Produto de Hadamard , e é diferente do produto de matriz mais comum. en.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee

36

apenas faça isso:

import numpy as np

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

a * b

1
nop, dá a multiplicação da matriz. Cloud resolve usando numpy.multiply
Malintha

2
Qual versão e versão secundária do Python você está usando? E de entorpecido?
smci

1
Usando Intel Python 3.5.2 com numpy 1.12.1, o *operador parece fazer multiplicação por elemento.
apnorton

1
Isso funciona para mim com Numpy 1.12.1 em Python 3.5.2 (construído usando gcc) também.
Autodidata de

6
@Malintha, acho que você está fazendo uma = np. ** matriz ** ([[1,2], [3,4]]) em vez
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

Ambos np.multiplye *resultariam na multiplicação elementar conhecida como Produto Hadamard

%timeit é ipython mágico


1

Experimente isto:

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)

Aqui, np.array(a)retorna uma matriz 2D do tipo ndarraye a multiplicação de dois ndarrayresultaria na multiplicação elemento sábio. Portanto, o resultado seria:

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

Se você quiser obter uma matriz, faça isso com:

result = np.mat(result)

Explique o que isso faz.
Leopold Joy

2
@LeopoldJoy Acabei de editar minha resposta, espero que isso ajude :))
Amir Rezazadeh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.