วิธีการรับการคูณเมทริกซ์ที่ชาญฉลาด (ผลิตภัณฑ์ Hadamard) เป็นตัวเลข


110

ฉันมีเมทริกซ์สองตัว

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และbไม่ได้ชนิดเมทริกซ์ NumPy หรือไม่? ด้วยคลาสนี้ให้*ส่งคืนผลิตภัณฑ์ด้านในไม่ใช่องค์ประกอบที่ชาญฉลาด แต่สำหรับndarrayคลาสปกติ*หมายถึงผลิตภัณฑ์ที่มีองค์ประกอบ
bnaecker

อาร์เรย์เป็นaและตัวเลขbหรือไม่ นอกจากนี้ในคำถามของคุณข้างต้นคุณกำลังใช้xและyการคํานวณแทนและa bนั่นเป็นเพียงการพิมพ์ผิดหรือเปล่า?
jtitusj

a และ b เป็นองค์ประกอบประเภท numpy matrix
Malintha

8
ใช้อาร์เรย์ numpy เสมอไม่ใช่เมทริกซ์ที่เป็นตัวเลข ดูว่าเอกสารจำนวนมากพูดถึงเรื่องนี้อย่างไร โปรดทราบว่าจาก python 3.5+ คุณสามารถใช้@สำหรับการคูณเมทริกซ์ด้วยอาร์เรย์ numpy ซึ่งหมายความว่าไม่มีเหตุผลที่ดีอย่างยิ่งที่จะใช้เมทริกซ์กับอาร์เรย์
ประวีณ

3
จู้จี้จุกจิกaและbเป็นรายการ พวกเขาจะทำงานในnp.dot; a*bแต่ไม่ได้อยู่ใน หากคุณใช้np.array(a)หรือnp.matrix(a)ได้*ผล แต่ได้ผลลัพธ์ที่แตกต่างกัน
hpaulj

คำตอบ:


161

สำหรับการคูณ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วัตถุมีความเข้ากันไม่ได้ที่น่ากลัวทุกประเภทกับ ndarrays ปกติ ด้วย ndarrays คุณสามารถใช้*สำหรับการคูณตามองค์ประกอบ:

a * b

หากคุณใช้ Python 3.5+ คุณจะไม่สูญเสียความสามารถในการคูณเมทริกซ์ด้วยตัวดำเนินการเนื่องจาก@ตอนนี้การคูณเมทริกซ์ :

a @ b  # matrix multiplication

12
เพียงเพื่อเพิ่มบริบทเล็กน้อย: ในพีชคณิตการดำเนินการนี้เรียกว่า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
nop มันให้การคูณเมทริกซ์ คลาวด์แก้ปัญหาโดยใช้ numpy. Multiply
Malintha

2
คุณใช้ Python เวอร์ชันใดและเวอร์ชันรอง และของ numpy?
smci

1
การใช้ Intel Python 3.5.2 กับ numpy 1.12.1 *ดูเหมือนว่าตัวดำเนินการจะทำการคูณอย่างชาญฉลาด
apnorton

1
สิ่งนี้ใช้ได้กับฉันกับ Numpy 1.12.1 บน Python 3.5.2 (สร้างโดยใช้ gcc) ด้วย
Autodidact

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และ*จะให้ผลคูณที่ชาญฉลาดที่เรียกว่าผลิตภัณฑ์ Hadamard

%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)ส่งคืนอาร์เรย์ 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.