Python 如何在numpy中获得元素矩阵乘法(Hadamard乘积)?

Python 如何在numpy中获得元素矩阵乘法(Hadamard乘积)?,python,numpy,matrix,matrix-multiplication,elementwise-operations,Python,Numpy,Matrix,Matrix Multiplication,Elementwise Operations,我有两个矩阵 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)) 及 但两者都给出了结果 [[19 22],[43 50] 这是矩阵积,不是元素积。如何使用内置函数获取元素级产品(又称Hadamard产品)?只需执行以下操作: import numpy as np a = n

我有两个矩阵

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

但两者都给出了结果

[[19 22],[43 50]

这是矩阵积,不是元素积。如何使用内置函数获取元素级产品(又称Hadamard产品)?

只需执行以下操作:

import numpy as np

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

a * b

对于
矩阵
对象的元素乘法,可以使用:

结果

array([[ 5, 12],
       [21, 32]])
但是,您应该真正使用
数组
,而不是
矩阵
<代码>矩阵对象与常规数组有各种可怕的不兼容性。使用Ndarray,您只需使用
*
进行元素乘法:

a * b
如果您使用的是Python 3.5+,您甚至不会失去使用运算符执行矩阵乘法的能力,因为:

np.multiply
*
都会产生称为哈达玛积的元素级乘法

%timeit
是ipython magic

试试这个:

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)
返回类型为
ndarray
的2D数组,两个
ndarray
相乘将导致元素相乘。因此,结果将是:

result = [[5, 12], [21, 32]]
如果你想得到一个矩阵,你可以这样做:

result = np.mat(result)

你确定
a
b
不是NumPy的矩阵类型吗?对于此类,
*
返回内积,而不是元素。但是对于通常的
ndarray
类,
*
表示元素级产品。
a
b
是numpy数组吗?另外,在您上面的问题中,您正在使用
x
y
进行计算,而不是
a
b
。这只是一个输入错误吗?a和b是numpy矩阵类型的元素通常使用numpy数组,而不是numpy矩阵。看看这个。还请注意,在python 3.5+中,您可以与numpy数组一起使用,这意味着绝对没有理由在数组上使用矩阵。他们将在np.dot中工作;但不在
a*b
中。如果使用
np.array(a)
np.matrix(a)
*
工作,但结果不同。nop,它给出矩阵乘法。云计算使用numpy.multiply解决它您使用的是哪个版本的Python和哪个版本的Python?numpy呢?使用Intel Python 3.5.2和numpy 1.12.1,
*
运算符似乎可以执行元素乘法。这对我来说也适用于Python 3.5.2(使用gcc构建)上的numpy 1.12.1。@Malintha,我认为你在做a=np.*matrix**([[1,2],[3,4]]),而不仅仅是为了添加一点上下文:在代数中,这种运算称为哈达玛积,它不同于更常见的矩阵积。请解释一下它的作用。@LeopoldJoy我刚刚编辑了我的答案,希望这有帮助:))
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
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)
result = [[5, 12], [21, 32]]
result = np.mat(result)