Soru Numune ile matris çarpımı (Hadamard ürünü) nasıl elde edilir?


İki matrisim var

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

ve ben elementi ü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 her ikisi de sonuç verir

[[19 22], [43 50]]

Matris ürünü olan eleman-ürün değil. Yerleşik fonksiyonları kullanarak element-bilge ürünü (aka Hadamard ürünü) nasıl alabilirim?


36
2017-10-14 04:35


Menşei


Emin misiniz a ve b NumPy'nin matris türü değil mi? Bu sınıf ile, * Öğeyi değil, iç ürünü döndürür. Ama her zamanki gibi ndarray sınıf, * eleman-bilge ürün demektir. - bnaecker
Hangi a ve b numpy dizileri? Ayrıca, yukarıdaki sorunuzda, kullanıyorsunuz x ve y yerine hesaplama için a ve b. Bu sadece bir yazım hatası mı? - jtitusj
a ve b numpy matrix tipi elemanlardır - Malintha
Her zaman numpy dizileri kullanın ve sayısal matrisler kullanmayın. Görmek ne yazıyor? bunun hakkında. Ayrıca python 3.5+ sürümünden de yararlanabilirsiniz. @ matris çarpımı için numol dizileri ile, diziler üzerinde matrisleri kullanmak için kesinlikle iyi bir sebep olmamalıdır. - Praveen
Seçici olmak, a ve b listeler. Çalışacaklar np.dot; ama değil a*b. Eğer kullanırsan np.array(a) veya np.matrix(a), * farklı sonuçlar ile çalışır. - hpaulj


Cevaplar:


Elementel çarpımı için matrix nesneleri 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, gerçekten kullanmalısınız array yerine matrix. matrix nesneler, düzenli ndarralarla her türlü korkunç uyumsuzluğa sahiptir. Ndarrays ile sadece kullanabilirsiniz * elementel çarpım için:

a * b

Python 3.5+ kullanıyorsanız, bir operatörle matris çarpma işlemini gerçekleştirme yeteneğini bile kaybetmezsiniz. @ şimdi matris çarpımı yapar:

a @ b  # matrix multiplication

54
2017-10-14 05:04



Sadece biraz bağlam eklemek için: Cebir, bu işlem olarak bilinir Hadamard Ürünüve daha yaygın matris ürününden farklıdır. en.wikipedia.org/wiki/Hadamard_product_(matrices) - FaCoffee


sadece şunu yap:

import numpy as np

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

a * b

24
2017-10-14 04:44



nop, matris çarpmasını verir. Cloud numpy.multiply kullanarak çöz - Malintha
Python'un hangi sürümü ve küçük sürümünü kullanıyorsunuz? Ve uyuşmuş mu? - smci
Intel Python 3.5.2'in 1.12.1 ile birlikte kullanılması, * operatör eleman-bilge çoğaltma yapmak gibi görünüyor. - apnorton
Bu benim için Python 3.5.2 (gcc kullanılarak) üzerinde Numpy 1.12.1 ile çalışır. - Sandeep Datta
@Malintha, bunun yerine bir = np. ** matris ** ([[1,2], [3,4]]) yaptığınızı düşünüyorum - SeF


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.multiply ve * Hadamard Ürünü olarak bilinen eleman bilge çarpmasını verir

%timeit ipython sihiri


5
2017-12-07 08:37





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)

İşte, np.array(a) bir 2B dizi türü döndürür ndarray ve iki çarpımı ndarray öğe bilge çarpma sonucu olur. Yani sonuç şöyle olurdu:

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

Bir matris elde etmek istiyorsanız, bununla yapın:

result = np.mat(result)

0
2017-12-26 05:32



Lütfen bunun ne yaptığını açıkla. - Leopold Joy
@LeopoldJoy Sadece cevabımı düzenledim, umarım bu yardımcı olur :)) - Amir Rezazadeh