¿Cómo obtener la multiplicación de matrices por elementos (producto de Hadamard) en numpy?

102

Tengo dos matrices

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

y quiero obtener el producto por elementos [[1*5,2*6], [3*7,4*8]], igual

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

Yo he tratado

print(np.dot(a,b)) 

y

print(a*b)

pero ambos dan el resultado

[[19 22], [43 50]]

que es el producto de la matriz, no el producto de elementos. ¿Cómo puedo obtener el producto basado en elementos (también conocido como producto Hadamard) utilizando funciones integradas?

Malintha
fuente
4
¿Estás seguro ay bno eres el tipo de matriz de NumPy? Con esta clase, *devuelve el producto interno, no el elemento. Pero para la ndarrayclase habitual , *significa producto basado en elementos.
bnaecker
son ay bmatrices numpy? Además, en su pregunta anterior, está utilizando xy ypara el cálculo en lugar de ay b. ¿Es solo un error tipográfico?
jtitusj
ayb son elementos de tipo matriz
numerosos
8
Utilice siempre matrices numpy y no matrices numpy. Vea lo que dicen los numerosos documentos sobre esto. También tenga en cuenta que desde Python 3.5+, puede usar @para la multiplicación de matrices con matrices numpy, lo que significa que no debería haber absolutamente ninguna buena razón para usar matrices sobre matrices.
Praveen
3
Ser quisquilloso, ay bson listas. Trabajarán en np.dot; pero no en a*b. Si usa np.array(a)o np.matrix(a), *funciona pero con resultados diferentes.
hpaulj

Respuestas:

154

Para la multiplicación de matrixobjetos por elementos, puede utilizar 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]])

Sin embargo, debería utilizar en arraylugar de matrix. matrixLos objetos tienen todo tipo de incompatibilidades horribles con los ndarrays regulares. Con ndarrays, puede usarlo *para la multiplicación por elementos:

a * b

Si está en Python 3.5+, ni siquiera pierde la capacidad de realizar la multiplicación de matrices con un operador, porque @la multiplicación de matrices ahora :

a @ b  # matrix multiplication
Rahul KP
fuente
11
Solo para agregar un poco de contexto: en Álgebra, esta operación se conoce como el Producto Hadamard y es diferente del producto matricial más común. en.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee
36

solo haz esto:

import numpy as np

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

a * b
jtitusj
fuente
1
nop, da la multiplicación de la matriz. Cloud lo resuelve usando numpy.multiply
Malintha
2
¿Qué versión y versión secundaria de Python estás usando? ¿Y de numpy?
smci
1
Usando Intel Python 3.5.2 con numpy 1.12.1, el *operador parece hacer una multiplicación de elementos.
apnorton
1
Esto también me funciona con Numpy 1.12.1 en Python 3.5.2 (construido con gcc).
Autodidacta
6
@Malintha, creo que estás haciendo una = np. ** matrix ** ([[1,2], [3,4]]) en su lugar
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.multiplyy *producirían una multiplicación sabia de elementos conocida como el Producto Hadamard

%timeit es magia ipython

4 áspero
fuente
1

Prueba esto:

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)

Aquí, np.array(a)devuelve una matriz 2D de tipo ndarrayy la multiplicación de dos ndarraydaría como resultado una multiplicación de elementos. Entonces el resultado sería:

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

Si quieres obtener una matriz, hazlo con esto:

result = np.mat(result)
Amir Rezazadeh
fuente
Explique qué hace esto.
Leopold Joy
2
@LeopoldJoy Acabo de editar mi respuesta, espero que esto ayude :))
Amir Rezazadeh