La forma más rápida de realizar un ciclo a la izquierda de una matriz numpy (como pop, push para una cola)

Con matrices numpy, quiero realizar esta operación:

  • mueva x[1],...,x[n-1] a x[0],...,x[n-2] (desplazamiento a la izquierda),
  • escriba un nuevo valor en el último índice: x[n-1] = newvalue .

Esto es similar a un pop() , push(newvalue) para una cola de primero en push(newvalue) último (solo invertido).

Una implementación ingenua es: x[:-1] = x[1:]; x[-1] = newvalue x[:-1] = x[1:]; x[-1] = newvalue .

Otra implementación, utilizando np.concatenate , es más lenta: np.concatenate((x[1:], np.array(newvalue).reshape(1,)), axis=0) .

¿Hay una manera más rápida de hacerlo?

Después de algunos experimentos, está claro que:

  • se requiere copia,
  • y la forma más rápida y sencilla de hacerlo, para nparray (numpy arrays) es cortar y copiar.

Entonces la solución es: x[:-1] = x[1:]; x[-1] = newvalue x[:-1] = x[1:]; x[-1] = newvalue .

Aquí hay un pequeño punto de referencia:

 >>> x = np.random.randint(0, 1e6, 10**8); newvalue = -100 >>> %timeit x[:-1] = x[1:]; x[-1] = newvalue 1000 loops, best of 3: 73.6 ms per loop >>> %timeit np.concatenate((x[1:], np.array(newvalue).reshape(1,)), axis=0) 1 loop, best of 3: 339 ms per loop 

Pero si no necesita tener un acceso rápido a todos los valores de la matriz, pero solo el primero o el último, usar un deque es más inteligente.