2015-11-05 7 views
6

मुझे आश्चर्य है कि नीचे के दृष्टिकोण को खराब अभ्यास माना जाएगा, और यदि ऐसा है, तो कोई अन्य दृष्टिकोण के प्रति कुछ मार्गदर्शन दे सकता है।numpy arrays के साथ सूची समझ - खराब अभ्यास?

a = np.array([[1,2,3],[4,5,6]]) 
b = np.array([-5,5]) 
c = np.array([np.multiply(a[x],b[x]) for x in range(2)]) 

उद्देश्य यहां के रूप में 'एक' जहां के पहले तत्व में मानों 'एक' पहले से गुणा कर रहे हैं एक ही आकार की एक सरणी प्राप्त करने के लिए है:

यहाँ प्रश्न में कोड है 'बी' के तत्व और 'ए' के ​​दूसरे तत्व में मानों को 'बी'

के दूसरे तत्व से गुणा किया गया है उपरोक्त कोड काम करता है, लेकिन सूचियों/सरणी के मिश्रण को देखते हुए मुझे चिंता है कि यह है के खिलाफ सलाह दी - लेकिन मैं एक और अधिक सुरुचिपूर्ण समाधान पर स्पष्ट नहीं हूँ। अग्रिम में बहुत धन्यवाद!

उत्तर

8

NumPythonic रास्ता np.newaxis/None के साथ एक 2 डी सरणी b के आयामों का विस्तार करने के लिए और फिर broadcasting एक vectorized elementwise multiplication के लिए खेलने में आने होगा। कार्यान्वयन इस प्रकार दिखाई देगा -

c = a * b[:,None] 

एक बार आयाम बढ़ा रहे हैं, तो आप भी एक ही प्रभाव के लिए np.multiply उपयोग कर सकते हैं, तो जैसे -

c = np.multiply(a,b[:,None]) 

सबसे महत्वपूर्ण बात, यहाँ कुछ प्रदर्शन नंबर आप को मनाने के लिए है broadcasting -

In [176]: a = np.random.rand(2000,3000) 

In [177]: b = np.random.rand(2000) 

In [178]: %timeit np.array([np.multiply(a[x],b[x]) for x in range(a.shape[0])]) 
10 loops, best of 3: 118 ms per loop 

In [179]: %timeit a * b[:,None] 
10 loops, best of 3: 63.8 ms per loop 

In [180]: %timeit np.multiply(a,b[:,None]) 
10 loops, best of 3: 64 ms per loop 
+0

यह बहुत उपयोगी है, धन्यवाद! मुझे "न्यूएक्सिस" अवधारणा को बेहतर समझना होगा। बी [: कोई नहीं] .shape अभी भी एक 1 डी सरणी इंगित करेगा और 2 नहीं, इसलिए मुझे यह आवश्यक नहीं होगा कि यह काम करे ... – laszlopanaflex

+3

'बी [: कोई नहीं]' बी से बहुत अलग है [:, कोई नहीं] '। अल्पविराम महत्वपूर्ण है। पहला टुकड़ा का हिस्सा है, 'टुकड़ा (कोई नहीं, कोई नहीं, कोई नहीं) '। दूसरे को 'numpy' द्वारा समझा जाता है ताकि यह विशेष' न्यूएक्सिस 'अर्थ हो। – hpaulj

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