2017-02-13 12 views
5

numpy और tensorflow में छोटे आयाम का आकार मैट्रिक्स (या टेंसर) को जोड़ना संभव है यदि छोटे मैट्रिक्स का आकार बड़ा मैट्रिक्स का प्रत्यय है। यह एक उदाहरण है:विभिन्न आयामों के साथ matrices जोड़ना

x = np.ndarray(shape=(10, 7, 5), dtype = float) 
y = np.ndarray(shape=(7, 5), dtype = float) 

इन दो मैट्रिक्स आपरेशन x+y के लिए है एक शॉर्टकट के लिए:

for a in range(10): 
    for b in range(7): 
     for b in range(5): 
      result[a,b,c] = x[a,b,c] + y[b,c] 

मेरे मामले में हालांकि मैं आकार (10,7,5) और (10,5) की मैट्रिक्स है और इसी तरह मैं प्रदर्शन करने के लिए चाहते हैं इस मामले तथापिमें

for a in range(10): 
    for b in range(7): 
     for b in range(5): 
      result[a,b,c] = x[a,b,c] + y[a,c] 
             ^

: + आपरेशन समान तर्क का प्रयोगऑपरेशन विफल रहता है क्योंकि न तो numpy और न ही tensorflow समझता है कि मैं क्या करना चाहता हूँ। क्या कोई तरीका है कि मैं इस ऑपरेशन को कुशलतापूर्वक कर सकता हूं (बिना पाइथन लूप लिखने के)?

अब तक मैं लगा मैं इस तरह einsum का उपयोग कर आकार (10,7,5) की एक अस्थायी मैट्रिक्स z परिचय हो सकता है कि में:

z = np.einsum('ij,k->ikj', y, np.ones(7)) 
x + z 

लेकिन यह एक स्पष्ट तीन आयामी मैट्रिक्स (या टेन्सर) और यदि संभव हो तो मैं बनाता है इससे बचना पसंद करेंगे।

उत्तर

3

NumPy में, आप 3D को y का विस्तार कर सकता है और उसके बाद जोड़ने -

x + y[:,None,:] 

tensorflow वास्तव में से नहीं निपटा है, लेकिन ऐसा लगता है कि हम इस्तेमाल कर सकते हैं अपने दस्तावेज़ों में देख tf.expand_dims -

x + tf.expand_dims(y, 1) 

विस्तारित संस्करण अभी भी y में एक दृश्य होगा और जैसा कि नीचे परीक्षण किया गया है, जैसे स्मृति का अब और कब्जा नहीं होगा -

In [512]: np.may_share_memory(y, y[:,None,:]) 
Out[512]: True 
+0

में पाया जा सकता यदि आप किसी भी संयोग से पता निर्माण tensorflow इसी करते हैं? – Kuba

+0

@ क्यूबा आज़माएं: 'x + tf.expand_dims (y, 1)'? पोस्ट में जोड़ा गया। – Divakar

+0

'tf.expand_dims' काम करता है! मैंने जवाब स्वीकार कर लिया है – Kuba

1

स्वीकृत उत्तर में सही तरीके से इंगित किया गया है कि समाधान उपलब्ध निर्माण का उपयोग करके आयामों का विस्तार करना है।

बिंदु यह समझना है कि मैट्रिस जोड़ने के मामले में मैट्रिस का प्रसारण कैसे कर रहा है अगर उनके आयाम मेल नहीं खाते हैं। नियम यह है कि दो मैट्रिक्स में एक अपवाद के साथ बिल्कुल समान आयाम होना चाहिए कि मैट्रिस में से कुछ आयामों को 1

E.g. द्वारा प्रतिस्थापित किया जा सकता है।

A  (4d array): 8 x 1 x 6 x 1 
B  (3d array):  7 x 1 x 5 
Result (4d array): 8 x 7 x 6 x 5 

इस उदाहरण और विस्तृत विवरण scipy डॉक्स https://docs.scipy.org/doc/numpy-1.10.0/user/basics.broadcasting.html

संबंधित मुद्दे