2011-04-16 15 views
5

İki adet 1D dizim var, bunlardan bazıları (a) ve o diziye (b) dizinler sağlayan bir diğeri vardır. B'deki değerlerin her zaman arttığını biliyorum, bir noktadan (bir yerde olabilir) hariç, sayının sonunda bitiminden a dizisinin başlangıcına kadarki zamandan beri azalır. Aşağıdaki yöntem işe yarıyor gibi görünüyor, ama sadece daha temiz bir yolun olması gerektiğini düşünüyorum. Birisi daha iyi bir şey önerebilir mi? Teşekkürler.Python/Numpy - Dizginin Sonuna Sarma Dilimi

Kodu:

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])) 

cevap

3

Biraz daha kısa, ama belki hala iyi yapabilirim ...

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

kullanarak göre biraz daha temiz hale olabilir: a bu olurdu 'np.roll (a, -B [i]) [b [i + 1] -b [i] + 1] – JoshAdel

+1

Teşekkürler, bu daha temiz. Potansiyel olarak çok büyük diziler için işleri yavaşlatabileceğini düşündüğüm rulo işlevine daha fazla çağrı gelmesine rağmen. Rulo kullanmadan bunu yapmayı düşünebilir misin? 'Np.roll'inizi (…' satırını basitçe bir [b [i]: b [i + 1] +1] 'ile değiştirmek, roll-over'ın meydana geldiği yerin dışındaki tüm durumlar için çalışır. –

+0

dizinin tamamını kendisine ekleyiniz ve indisleri bir [start: end] 'için yeniden hesaplayınız, ama bence bu daha karmaşıktır, daha az değil, emin adımlarla bunu yapmanın bir yolu var, sadece cehennem Denemek için zamanım vardı ... – Benjamin

0

bu yardımcı olur emin değilim, ama anısına ile karışıklık olmadan hızlı bir yoludur Değil

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