Numpy

2013-01-18 21 views
19

के साथ एन भाग में पैरािटिशन सरणी भाग में एक सरणी विभाजित करने के लिए यह How do you split a list into evenly sized chunks? है। क्या अम्पी का उपयोग करके विशाल सरणी के लिए यह और अधिक कुशलता से करने के लिए वैसे भी है?Numpy

+0

क्षमा करें मैं अभी भी एक कुशल उत्तर की तलाश में हूं;)। अभी मैं सोच रहा हूं कि ctypes एकमात्र कुशल तरीका है। –

+1

कुशल परिभाषित करें। कुछ नमूना डेटा दें, अपनी वर्तमान विधि, कितनी तेज़ है, और आपको कितनी तेज़ी से इसकी आवश्यकता है। –

उत्तर

7

मुझे विश्वास है कि आप numpy.split या संभवतः numpy.array_split की तलाश कर रहे हैं यदि अनुभागों की संख्या को सरणी के आकार को सही तरीके से विभाजित करने की आवश्यकता नहीं है।

+0

जैसा कि मैंने प्रशांत से पूछा था। आप रिक्त numpy arrays से कैसे छुटकारा पा सकते हैं? –

33

numpy.array_split आज़माएं।

प्रलेखन से: numpy.split को

>>> x = np.arange(8.0) 
>>> np.array_split(x, 3) 
    [array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7.])] 

समान है, लेकिन अगर समूहों बराबर लंबाई नहीं हैं एक अपवाद आगे नहीं बढ़ेगी।

तो मात्रा की संख्या> लेन (सरणी) आप खाली सरणियों के अंदर नेस्टेड मिलता है, कि पता करने के लिए - अगर आपकी विभाजन सरणी a में सहेजा जाता है, तो आप से खाली सरणियों निकाल सकते हैं:

[x for x in a if x.size > 0] 

बस को बचाने के यदि आप चाहें तो a में वापस।

+0

हालांकि आप खाली सूचियों को कैसे हटा सकते हैं? –

+0

क्या आप एक छोटा सा उदाहरण प्रदान कर सकते हैं? –

+0

यदि # चंक्स> लेन (सरणी) आपको अंदर घोंसले खाली रिक्त स्थान मिलते हैं। –

13

बस array_split के उपयोग पर कुछ उदाहरण, split, hsplit and vsplit: जो करने के लिए '
आप किसी सरणी या दूसरा तर्क के रूप में सूची आप मूल रूप से सूचकांक (पहले) दे देते हैं:

n [9]: a = np.random.randint(0,10,[4,4]) 

In [10]: a 
Out[10]: 
array([[2, 2, 7, 1], 
     [5, 0, 3, 1], 
     [2, 9, 8, 8], 
     [5, 7, 7, 6]]) 

कुछ array_split के प्रयोग पर उदाहरण कट '

# split rows into 0|1 2|3 
In [4]: np.array_split(a, [1,3]) 
Out[4]:                              
[array([[2, 2, 7, 1]]),                          
array([[5, 0, 3, 1],                           
     [2, 9, 8, 8]]),                           
array([[5, 7, 7, 6]])] 

# split columns into 0| 1 2 3 
In [5]: np.array_split(a, [1], axis=1)                       
Out[5]:                              
[array([[2],                             
     [5],                             
     [2],                             
     [5]]),                             
array([[2, 7, 1],                            
     [0, 3, 1], 
     [9, 8, 8], 
     [7, 7, 6]])] 

दूसरे तर्क के रूप में एक पूर्णांक। बराबर मात्रा की संख्या निर्दिष्ट करता है:

In [6]: np.array_split(a, 2, axis=1) 
Out[6]: 
[array([[2, 2], 
     [5, 0], 
     [2, 9], 
     [5, 7]]), 
array([[7, 1], 
     [3, 1], 
     [8, 8], 
     [7, 6]])] 

विभाजन एक ही काम करता है, लेकिन अगर एक समान विभाजन array_split लिए आप शॉर्टकट vsplit और hsplit उपयोग कर सकते हैं संभव

नहीं है इसके अलावा एक अपवाद को जन्म देती है।

In [11]: np.vsplit(a, 2) 
Out[11]: 
[array([[2, 2, 7, 1], 
     [5, 0, 3, 1]]), 
array([[2, 9, 8, 8], 
     [5, 7, 7, 6]])] 

In [12]: np.hsplit(a, 2) 
Out[12]: 
[array([[2, 2], 
     [5, 0], 
     [2, 9], 
     [5, 7]]), 
array([[7, 1], 
     [3, 1], 
     [8, 8], 
     [7, 6]])] 
+0

इसके साथ मेरी समस्या यह है कि अगर भाग> लेन (सरणी) तो आपको खाली घोंसला वाले सरणी मिलती हैं ... आप इससे कैसे छुटकारा पा सकते हैं? –

+0

अच्छे उदाहरण, धन्यवाद। आपके 'np.array_split (ए, [1], अक्ष = 1) 'उदाहरण में, क्या आप जानते हैं कि पहले सरणी को प्रत्येक तत्व को नेस्टेड होने से कैसे रोकें? – timgeb

4

नहीं काफी एक जवाब है, लेकिन अन्य (सही) उत्तर देने के लिए कोड का अच्छा स्वरूपण के साथ एक लंबी टिप्पणी:
vsplit और hsplit काफी आत्म explanatry हैं। यदि आप निम्न का प्रयास करते हैं, तो आप देखेंगे कि जो भी आप प्राप्त कर रहे हैं वह मूल सरणी के दृश्य हैं, कॉपी नहीं, और यह आपके द्वारा लिंक किए गए प्रश्न में स्वीकृत उत्तर का मामला नहीं था। संभावित साइड इफेक्ट्स से अवगत रहें!

>>> x = np.arange(9.0) 
>>> a,b,c = np.split(x, 3) 
>>> a 
array([ 0., 1., 2.]) 
>>> a[1] = 8 
>>> a 
array([ 0., 8., 2.]) 
>>> x 
array([ 0., 8., 2., 3., 4., 5., 6., 7., 8.]) 
>>> def chunks(l, n): 
...  """ Yield successive n-sized chunks from l. 
...  """ 
...  for i in xrange(0, len(l), n): 
...   yield l[i:i+n] 
... 
>>> l = range(9) 
>>> a,b,c = chunks(l, 3) 
>>> a 
[0, 1, 2] 
>>> a[1] = 8 
>>> a 
[0, 8, 2] 
>>> l 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
+0

+1) यह विचार करने के लिए एक अच्छा मुद्दा है, आप कुछ मल्टीडिम को संभालने के लिए अपने समाधान को आगे बढ़ा सकते हैं। मामले –

+0

हाँ इस समय मैं इसका उपयोग करता हूं। मैं numpy का उपयोग कर ऐसा करने के लिए एक अच्छा तरीका सोच रहा था। esp। बहु-मंद के साथ :( –

+0

यह बड़े डेटा के लिए प्रासंगिक है। मैं 'numpy.array_split' का उपयोग कर रहा हूं जो डेटा की प्रतिलिपि बनाने के लिए प्रतीत होता है। इसे आपके मल्टीप्रोसेसिंग पूल में पास करने से डेटा की एक और प्रतिलिपि बन जाएगी ... – displayname