Numpy'de element-wise matris çarpımı (Hadamard çarpımı) nasıl elde edilir?


110

İki matrisim var

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

ve ben öğeye göre ürünü almak istiyorum, [[1*5,2*6], [3*7,4*8]], eşit

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

denedim

print(np.dot(a,b)) 

ve

print(a*b)

ama ikisi de sonucu verir

[[19 22], [43 50]]

bu matris çarpımıdır, eleman bazlı çarpım değildir. Yerleşik işlevleri kullanarak element bazlı ürünü (diğer adıyla Hadamard ürünü) nasıl elde edebilirim?


4
Emin misiniz ave bNumPy'nin matris türü değil misiniz? Bu sınıfla, *eleman bazlı değil, iç çarpımı döndürür. Ancak her zamanki ndarraysınıf için, *element açısından ürün anlamına gelir.
bnaecker

Hangi ave bnumpy diziler? Ayrıca, yukarıdaki söz konusu, kullandığınız xve yyerine hesaplaması için ave b. Bu sadece bir yazım hatası mı?
jtitusj

a ve b
uyuşmuş

8
Her zaman uyuşuk diziler kullanın, uyuşuk matrisler kullanmayın. Uyuşuk belgelerin bunun hakkında ne dediğine bir bakın . Ayrıca python 3.5+ ile @matris çarpımı için numpy dizileri kullanabileceğinizi unutmayın , bu da matrisleri diziler yerine kullanmak için kesinlikle iyi bir neden olmaması gerektiği anlamına gelir.
Praveen

3
Seçici olmak ave blistelerdir. Çalışacaklar np.dot; ama içinde değil a*b. np.array(a)Veya kullanırsanız np.matrix(a), *çalışır ancak farklı sonuçlarla.
hpaulj

Yanıtlar:


161

matrixNesnelerin elementel çarpımı için şunları kullanabilirsiniz numpy.multiply:

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

Sonuç

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

Ancak, arraybunun yerine gerçekten kullanmalısınız matrix. matrixnesneler, normal ndarray'larla her türlü korkunç uyumsuzluğa sahiptir. Ndarrays ile, *elementsel çarpma için kullanabilirsiniz :

a * b

Python 3.5+ kullanıyorsanız, bir operatörle matris çarpımını gerçekleştirme yeteneğinizi kaybetmezsiniz, çünkü @artık matris çarpımı yapar :

a @ b  # matrix multiplication

12
Biraz bağlam eklemek gerekirse: Cebirde bu işlem Hadamard Ürünü olarak bilinir ve daha yaygın olan matris ürününden farklıdır. en.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee

36

sadece şunu yap:

import numpy as np

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

a * b

1
nop, matris çarpımını verir. Bulut, numpy.multiply kullanarak çöz
Malintha

2
Python'un hangi sürümünü ve alt sürümünü kullanıyorsunuz? Ve uyuşmuş?
smci

1
Intel Python 3.5.2'yi numpy 1.12.1 ile kullanarak, *operatör eleman bazında çarpma yapıyor gibi görünüyor.
apnorton

1
Bu benim için Python 3.5.2'de (gcc kullanılarak oluşturulmuş) Numpy 1.12.1 ile çalışıyor.
Autodidact

6
@Malintha, sanırım onun yerine a = np. ** matrix ** ([[1,2], [3,4]])
yapıyorsun

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

Her ikisi de np.multiplyve *Hadamard Ürünü olarak bilinen element bilge çarpımını verir

%timeit ipython sihir mi


1

Bunu dene:

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)

Burada, np.array(a)2B bir tür dizisi döndürür ndarrayve ikisinin çarpımı, ndarrayeleman bilge çarpımıyla sonuçlanır. Sonuç şu olur:

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

Bir matris almak istiyorsanız, bununla yapın:

result = np.mat(result)

Lütfen bunun ne yaptığını açıklayın.
Leopold Joy

2
@LeopoldJoy Cevabımı yeni düzenledim, umarım bu yardımcı olur :))
Amir Rezazadeh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.