2011-04-16 23 views
5

के अंत के आसपास मैं दो -1 डी सरणियों है, एक ब्याज (क) में से कुछ मानों और दूसरा जो कि सरणी में सूचकांक प्रदान करता है (ख)। मुझे पता है कि बी में मान हमेशा बढ़ते हैं, एक बिंदु को छोड़कर (कहीं भी हो सकता है) जहां संख्या कम हो जाती है क्योंकि यह अंत से सरणी की शुरुआत तक रोल हो जाती है। नीचे दी गई विधि काम करने लगती है, लेकिन मुझे लगता है कि एक क्लीनर तरीका मौजूद होना चाहिए। क्या कोई बेहतर कुछ सुझाव दे सकता है? धन्यवाद।अजगर/Numpy - लपेटें स्लाइस सरणी

कोड:

import numpy as np 
a = np.arange(12) 
b = np.array([5, 9, 2, 4]) 
#I want to generate these: 
#[5,6,7,8,9] 
#[9,10,11,0,1,2] 
#[2,3,4] 
#[4,5] 

a = np.roll(a, -b[0], axis=0) 
# Subtract off b[0] but ensure that all values are positive 
b = (b-b[0]+len(a))%len(a) 
for i, ind in enumerate(b): 
    if i < len(b)-1: 
     print a[b[i]:b[i+1]+1] 
    else: 
     print np.hstack((a[b[i]:len(a)], a[0])) 

उत्तर

3
थोड़ा कम

, लेकिन शायद मैं अभी भी बेहतर कर सकते हैं ...

import numpy as np 

a = np.arange(12) 
b = np.array([5, 9, 2, 4]) 
b = np.append(b, b[0]) 

for i in range(0, len(b)-1): 
    print np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] 
+0

आप इसे का उपयोग करके एक छोटे से क्लीनर कर सकता है: a इस होगा 'np.roll (क, -b [i]) [: ख [i + 1] बी [i] +1] ' – JoshAdel

+1

धन्यवाद, यह क्लीनर है। यद्यपि इसमें रोल फ़ंक्शन पर संभावित रूप से कई और कॉल हैं, जो मुझे लगता है कि बहुत बड़ी सरणी के लिए चीजों को धीमा कर सकता है। क्या आप रोल का उपयोग किए बिना ऐसा करने के बारे में सोच सकते हैं? । 'के अलावा है कि एक जहां रोल-ओवर होता है सभी मामलों के लिए काम करेगा –

+0

आप किए जा सकेंगे: बस' एक [ख [i + 1] +1 बी [मैं]] के साथ अपने 'np.roll (...' लाइन की जगह पूरे सरणी को अपने आप में जोड़ दें, और 'ए [स्टार्ट एंड एंड]' के लिए इंडेक्स को फिर से समझें, लेकिन मुझे लगता है कि यह अधिक जटिल होगा, कम नहीं। मुझे यकीन है कि यह करने के लिए एक तरीका है, बस हेवन कोशिश करने का समय नहीं था ... – Benjamin

0

सुनिश्चित नहीं हैं कि अगर यह मदद करता है, लेकिन की स्मृति के साथ खिलवाड़ के बिना एक तेजी से रास्ता

import numpy as np 

a = np.arange(12) 
b = np.array([5, 9, 2, 4]) 
b = np.append(b, b[0]) 

b2 = b.copy() 

b2[(np.diff(b)<0).nonzero()[0]+1:] += a.size 

print [np.take(a, np.r_[b2[i]:b2[i+1]+1], mode='wrap') for i in range(b.size-1)] 

print [np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] for i in range(b.size-1)] 

%timeit [np.take(a, np.r_[b2[i]:b2[i+1]+1], mode='wrap') for i in range(b.size-1)] 
# 10000 loops, best of 3: 28.6 µs per loop 

%timeit [np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] for i in range(b.size-1)] 
# 10000 loops, best of 3: 77.7 µs per loop 
संबंधित मुद्दे