numpyで要素ごとの行列乗算(アダマール積)を取得するにはどうすればよいですか?


102

2つの行列があります

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
よろしいですabnumpyののマトリックス型ではありませんか?このクラスで*は、要素ごとではなく内積を返します。しかし、通常のndarrayクラスで*は、要素ごとの積を意味します。
bnaecker

あるabnumpyの配列?また、上の質問では、andの代わりにand を計算に使用xyています。それは単なるタイプミスですか?ab
jtitusj

aとbは、
派手な

8
numpy行列ではなく、常にnumpy配列を使用してください。numpy docsがこれについて言っていることを見てください。また、Python 3.5以降では、numpy配列を使用@した行列の乗算に使用できることにも注意してください。これは、配列に対して行列を使用する正当な理由がないことを意味します。
Praveen

3
うるさいこと、するにaしてbリストです。彼らはで動作しnp.dotます。しかし、ではありませんa*bnp.array(a)またはを使用した場合np.matrix(a)*機能しますが結果は異なります。
hpaulj 2016年

回答:


154

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代わりに実際に使用する必要がありますmatrixmatrixオブジェクトには、通常のndarrayとのあらゆる種類の恐ろしい非互換性があります。ndarrayを使用すると*、要素ごとの乗算に使用できます。

a * b

あなたは、Python 3.5+にしている場合ので、あなたも、オペレータとの行列乗算を実行する能力を失うことはありません。@今、行列の乗算を行います

a @ b  # matrix multiplication

11
少しコンテキストを追加するだけです。代数では、この演算はアダマール積と呼ばれ、より一般的な行列積とは異なります。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のどのバージョンとマイナーバージョンを使用していますか?そして派手なの?
smci 2016年

1
numpy 1.12.1でIntel Python 3.5.2を使用*すると、演算子は要素ごとの乗算を行うように見えます。
apnorton 2017

1
これは、Python 3.5.2(gccを使用して構築)上のNumpy 1.12.1でも動作します。
Autodidact 2017年

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配列を返し、2のndarray乗算はndarray要素ごとの乗算になります。したがって、結果は次のようになります。

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

マトリックスを取得したい場合は、次のようにします。

result = np.mat(result)

これが何をするか説明してください。
Leopold Joy

2
@LeopoldJoy私は私の答えを編集しました、これが役に立てば幸いです:))
Amir Rezazadeh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.