İ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]))
kullanarak göre biraz daha temiz hale olabilir:
a
bu olurdu 'np.roll (a, -B [i]) [b [i + 1] -b [i] + 1] – JoshAdelTeş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. –
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