Tengo dos matrices 1D, una que tiene algunos valores de interés (a) y otra que proporciona índices en esa matriz (b). Sé que los valores en b siempre aumentan, excepto en un punto (podría estar en cualquier parte) donde el número disminuye ya que se desplaza desde el final hasta el comienzo de la matriz a. El siguiente método parece funcionar, pero creo que debe existir una forma más limpia. ¿Alguien puede sugerir algo mejor? Gracias.Python/Numpy - Wrap Slice Around End of Array
Código:
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]))
de que podría hacer un poco más limpio mediante el uso de: 'np.roll (a, -B [i]) [: b [i + 1] -b [i] 1] ' – JoshAdel
Gracias, esto es más limpio. A pesar de que potencialmente tiene muchas más llamadas a la función de balanceo, lo que supongo podría ralentizar las cosas para matrices muy grandes. ¿Puedes pensar de todos modos para hacer esto sin usar rollo? Reemplazar su línea 'np.roll (...' simplemente con 'a [b [i]: b [i + 1] +1] 'funcionaría para todos los casos, además de aquel en el que se produce el vuelco. –
Podría Anexar toda la matriz a, y volver a calcular los índices para 'a [start: end]', pero creo que eso sería más complicado, no menos. Estoy seguro de que hay una manera de hacer esto con zancadas, solo asilo Tuve tiempo de intentarlo ... – Benjamin