2014-05-16 8 views
6

इस प्रश्न से पहले पूछा गया है, लेकिन समाधान केवल 1 डी/2 डी सरणी के लिए काम करता है, और मुझे एक और सामान्य उत्तर की आवश्यकता है।पायथन - डेटा को प्रतिलिपि किए बिना numpy array को दोहराएं

डेटा को दोहराने के बिना आप दोहराने वाले सरणी कैसे बनाते हैं? यह मुझे सामान्य उपयोग के रूप में मारता है, क्योंकि यह स्मृति हिट के बिना पायथन ऑपरेशंस को सदिश बनाने में मदद करेगा।

अधिक विशेष रूप से, मेरे पास एक (y, x) सरणी है, जिसे मैं एक (z, y, x) सरणी बनाने के लिए कई बार टाइल करना चाहता हूं। मैं numpy.tile (सरणी, (एनजे, 1,1) के साथ ऐसा कर सकता हूं), लेकिन मैं स्मृति से बाहर चला गया। मेरा विशिष्ट मामला एक्स = 1500, वाई = 2000, जेड = 700 है।

+1

आप बड़े सरणी के साथ क्या करने जा रहे हैं? 'सरणी [कोई नहीं,:,:]' टाइल वाले सरणी के रूप में उतना ही उपयोगी हो सकता है। जब तक आप y या x आयाम पर किसी प्रकार का 'dot' उत्पाद नहीं करते हैं, तब भी आप स्मृति त्रुटि के साथ समाप्त हो सकते हैं। – hpaulj

+0

मुझे फॉर्म (समय, वाई, एक्स) में भौगोलिक डेटासेट में भौगोलिक मुखौटा लागू करना होगा। मैं जिस मॉड्यूल का उपयोग कर रहा हूं वह आवश्यक है कि मास्क डेटासेट के समान आकार हो, इसलिए मुझे समय आयाम पर (y, x) मास्क को दोहराने की आवश्यकता है। – user3644731

उत्तर

4

एक साधारण चाल np.broadcast_arrays उपयोग करने वाला पहला आयाम में एक z लंबी वेक्टर के खिलाफ अपने (x, y) प्रसारित करने के लिए है:

import numpy as np 

M = np.arange(1500*2000).reshape(1500, 2000) 
z = np.zeros(700) 

# broadcasting over the first dimension 
_, M_broadcast = np.broadcast_arrays(z[:, None, None], M[None, ...]) 

print M_broadcast.shape, M_broadcast.flags.owndata 
# (700, 1500, 2000), False 

stride_tricks विधि this answer में एक 1 डी सरणी के लिए दिया सामान्यीकरण करने के लिए, तुम सिर्फ करने की जरूरत है अपने आउटपुट सरणी के प्रत्येक आयाम के लिए आकार और स्ट्रैड लम्बाई शामिल करें:

M_strided = np.lib.stride_tricks.as_strided(
       M,        # input array 
       (700, M.shape[0], M.shape[1]), # output dimensions 
       (0, M.strides[0], M.strides[1]) # stride length in bytes 
      ) 
+0

ब्रॉडकास्टिंग चीज वही करता है जो मैं चाहता था। यह मुझे stride_tricks विधि की तुलना में सरल/अधिक तार्किक लगता है। – user3644731

+0

आंतरिक रूप से 'broadcast_arrays' इस तरह से 'as_strided' का उपयोग करता है। 'Numpy/lib/stride_tricks.py' में देखें। यह पहला आयाम के लिए '0' स्ट्रिंग लम्बाई है जो चाल करता है। – hpaulj

+0

'बाइट्स लाइन में 'स्लाइड की लंबाई' (0, एम। राइडराइड [0], एमस्ट्रिड्स [1])' – hpaulj