संख्यात्मक रूप से तत्व-वार मैट्रिक्स गुणन (हैमर्ड उत्पाद) कैसे प्राप्त करें?


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]]

जो मैट्रिक्स उत्पाद है, तत्व-वार उत्पाद नहीं है। मैं अंतर्निहित कार्यों का उपयोग करके तत्व-वार उत्पाद (उर्फ हैडमर्ड उत्पाद) कैसे प्राप्त कर सकता हूं?


4
क्या आप निश्चित हैं aऔर bNumPy का मैट्रिक्स प्रकार नहीं हैं? इस वर्ग के साथ, *आंतरिक उत्पाद लौटाता है, तत्व-वार नहीं। लेकिन सामान्य ndarrayवर्ग के लिए, *तत्व-वार उत्पाद का मतलब है।
बॅनेकर

कर रहे हैं aऔर bसुन्न arrays? इसके अलावा, ऊपर अपने प्रश्न में है, तो आप उपयोग कर रहे हैं xऔर yबजाय की गणना के लिए aऔर b। क्या वह सिर्फ एक टाइपो है?
jtitusj

ए और बी सुपीरियर मैट्रिक्स प्रकार के तत्व हैं
मालिथा

8
हमेशा सुन्न सरणियों का उपयोग करें, न कि खसखस ​​का उपयोग करें। देखें कि इस बारे में सुन्न डॉक्स क्या कहते हैं। यह भी ध्यान दें कि अजगर 3.5+ से, आप @मैट्रिक्स गुणा के लिए सुन्न सरणियों के साथ उपयोग कर सकते हैं , जिसका अर्थ है कि सरणियों पर मेट्रिसेस का उपयोग करने के लिए बिल्कुल अच्छा कारण नहीं होना चाहिए।
प्रवीण

3
Picky होने के लिए, aऔर bसूचियाँ हैं। वे में काम करेंगे np.dot; लेकिन में नहीं a*b। यदि आप उपयोग करते हैं np.array(a)या करते हैं np.matrix(a), *लेकिन विभिन्न परिणामों के साथ।
हंपुलज

जवाबों:


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इसके बजाय वास्तव में उपयोग करना चाहिए matrixmatrixवस्तुओं में नियमित रूप से ndarrays के साथ भयानक असंगतताएं हैं। Ndarrays के साथ, आप बस *एलिमेंट वाइज गुणा के लिए उपयोग कर सकते हैं :

a * b

यदि आप पायथन 3.5+ पर हैं, तो आप ऑपरेटर के साथ मैट्रिक्स गुणन करने की क्षमता भी नहीं खोते हैं, क्योंकि @अब मैट्रिक्स गुणन करता है :

a @ b  # matrix multiplication

12
बस थोड़ा सा संदर्भ जोड़ने के लिए: बीजगणित में, इस ऑपरेशन को हैडमर्ड उत्पाद के रूप में जाना जाता है , और यह अधिक सूक्ष्म मैट्रिक्स उत्पाद से अलग है। en.wikipedia.org/wiki/Hadamard_product_(matrices)
फ़ॉकोफ़ी

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
आप पायथन के किस संस्करण और मामूली संस्करण का उपयोग कर रहे हैं? और सुन्न के?
smci

1
Intel Python 3.5.2 का उपयोग सुन्न 1.12.1 के साथ करते हुए, *ऑपरेटर तत्व-वार गुणा करना प्रकट करता है।
एपर्टोर्टन

1
यह मेरे लिए नम्पी 1.12.1 के साथ पायथन 3.5.2 (जीसीसी का उपयोग करके बनाया गया) पर भी काम करता है।
ऑटोडिडैक्ट

6
@ मलिनथा, मुझे लगता है कि आप एक = np। ** मैट्रिक्स ** ([[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 आइपीथॉन जादू है


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)

कृपया बताएं कि यह क्या करता है।
लियोपोल्ड जॉय

2
@ लियोपोल्डजॉय मैंने सिर्फ अपना उत्तर संपादित किया, आशा है कि यह मदद करता है :))
अमीर रेजाज़ादे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.