2010-08-16 17 views
18

मैं न्यूपी/साइपी के लिए नया हूं। प्रलेखन से, यह को एपेंड/डालने/कॉन्सटेनेट के बजाय एकल सरणी को प्रीलोकेट करने के लिए अधिक प्रभावी लगता है।NumPy arrays को प्रीलाकेट करने का पसंदीदा तरीका क्या है?

उदाहरण के लिए, 1 एक सरणी के लिए के एक स्तंभ जोड़ने के लिए, मुझे लगता है कि यह:

ar0 = np.linspace(10, 20, 16).reshape(4, 4) 
ar0[:,-1] = np.ones_like(ar0[:,0]) 

यह करने के लिए पसंद किया जाता है:

ar0 = np.linspace(10, 20, 12).reshape(4, 3) 
ar0 = np.insert(ar0, ar0.shape[1], np.ones_like(ar0[:,0]), axis=1) 

मेरा पहला सवाल यह है कि यह सही है है (कि पहला बेहतर है), और मेरा दूसरा सवाल यह है कि फिलहाल, मैं इस तरह के अपने सरणी को पूर्ववत कर रहा हूं (जिसे मैंने साइपी साइट पर कई कुकबुक उदाहरणों में देखा है):

np.zeros((8,5)) 

ऐसा करने के लिए 'न्यूपी-पसंदीदा' तरीका क्या है?

उत्तर

17

प्रीलोकेशन मैलॉक्स आपको एक कॉल में आवश्यक सभी मेमोरी (सरणी को जोड़ने, सम्मिलित करने, सम्मिलित करने या आकार बदलने के लिए) के दौरान, सरणी को स्मृति के बड़े ब्लॉक में कॉपी करने की आवश्यकता हो सकती है। तो आप सही हैं, preallocation को आकार देने (और तेजी से होना चाहिए) आकार बदलना है।

आप जो बनाना चाहते हैं उसके आधार पर numpy arrays को पूर्ववत करने के लिए कई "पसंदीदा" तरीके हैं। np.zeros, np.ones, np.empty, np.zeros_like, np.ones_like, और np.empty_like, और कई अन्य जो np.linspace, और np.arange जैसे उपयोगी सरणी बनाते हैं।

तो

ar0 = np.linspace(10, 20, 16).reshape(4, 4) 

ठीक अगर यह ar0 आप इच्छा के सबसे करीब आता है।

हालांकि, पिछले कॉलम सभी 1 के, मुझे लगता है कि पसंदीदा तरीका सिर्फ इतना कहना है

ar0[:,-1]=1 

होगा के बाद से ar0[:,-1] के आकार (4,) है बनाने के लिए, 1 broadcasted इस आकार से मेल करने के लिए है।

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