numpy에서 요소 별 행렬 곱셈 (아다 마르 곱)을 얻는 방법은 무엇입니까?


104

두 개의 행렬이 있습니다

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 제품)을 얻으려면 어떻게해야합니까?


4
확실 a하고 bNumPy의 행렬 유형이 아닙니까? 이 클래스를 사용하면 *요소가 아닌 내부 곱을 반환합니다. 그러나 일반적인 ndarray클래스의 경우 *요소 별 제품을 의미합니다.
bnaecker

이다 abNumPy와 배열? 또한 위의 질문에서 xand y대신 a및 계산을 위해 사용 하고 b있습니다. 오타 일 뿐입니 까?
jtitusj

A와 B는 NumPy와 매트릭스 형 요소
Malintha

8
항상 numpy 행렬이 아닌 numpy 배열을 사용하십시오. 참조 NumPy와 문서는 말을 이것에 대해. 또한 파이썬 3.5 이상부터는 numpy 배열 @로 행렬 곱셈에 사용할 수 있습니다. 즉, 배열보다 행렬을 사용할 이유가 전혀 없어야합니다.
Praveen

3
까다 롭고,하려면 ab목록입니다. 그들은 일할 것입니다 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개체에는 일반 ndarray와 모든 종류의 끔찍한 비 호환성이 있습니다. ndarrays를 사용 *하면 요소 별 곱셈에 사용할 수 있습니다 .

a * b

파이썬 3.5에 경우 때문에, 당신도, 연산자와 행렬 곱셈을 수행 할 수있는 능력을 잃지 말고 @지금 행렬 곱셈을 수행합니다 :

a @ b  # matrix multiplication

12
약간의 맥락을 추가하기 위해 : Algebra에서이 연산은 Hadamard Product 로 알려져 있으며 보다 일반적인 행렬 곱과는 다릅니다. 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
아니요, 행렬 곱셈을 제공합니다. 클라우드는 numpy.multiply 사용하여 해결
Malintha

2
사용중인 Python의 버전 및 부 버전은 무엇입니까? 그리고 numpy?
smci

1
numpy 1.12.1과 함께 Intel Python 3.5.2를 사용하면 *연산자가 요소 별 곱셈을 수행하는 것처럼 보입니다.
apnorton

1
이것은 Python 3.5.2 (gcc를 사용하여 빌드 됨)의 Numpy 1.12.1에서도 작동합니다.
Autodidact

6
@Malintha, 나는 당신이 대신 = 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및 둘 다 *Hadamard Product로 알려진 요소 현명한 곱셈을 산출합니다.

%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 배열 유형을 반환하고 2를 ndarrayndarray하면 요소 현명한 곱셈이됩니다. 따라서 결과는 다음과 같습니다.

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

행렬을 얻으려면 다음과 같이하십시오.

result = np.mat(result)

이것이 무엇을하는지 설명하십시오.
레오폴드 기쁨

2
@LeopoldJoy 난 그냥이 :)) 도움이되기를 바랍니다, 내 대답을 편집
아미르 Rezazadeh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.