¿Cómo extender una matriz in situ en Numpy?

Actualmente, tengo un código como este

import numpy as np ret = np.array([]) for i in range(100000): tmp = get_input(i) ret = np.append(ret, np.zeros(len(tmp))) ret = np.append(ret, np.ones(fixed_length)) 

Creo que este código no es eficiente ya que np.append necesita devolver una copia de la matriz en lugar de modificar la ret en su lugar

Me preguntaba si puedo usar la extend para una matriz numpy como esta:

 import numpy as np from somewhere import np_extend ret = np.array([]) for i in range(100000): tmp = get_input(i) np_extend(ret, np.zeros(len(tmp))) np_extend(ret, np.ones(fixed_length)) 

Para que la extend sea ​​mucho más eficiente. ¿Alguien tiene ideas sobre esto? ¡Gracias!

Imagine una matriz numpy como ocupando un bloque contiguo de memoria. Ahora imagine otros objetos, digamos otras matrices numpy, que están ocupando la memoria justo a la izquierda y a la derecha de nuestra matriz numpy. No habría espacio para agregar o ampliar nuestra matriz numpy. Los datos subyacentes en una matriz numpy siempre ocupan un bloque contiguo de memoria.

Por lo tanto, cualquier solicitud de agregar o ampliar nuestra matriz numpy solo se puede satisfacer asignando un bloque de memoria nuevo y más grande, copiando los datos antiguos en el nuevo bloque y luego añadiéndolos o extendiéndolos.

Asi que:

  1. No ocurrirá en el lugar.
  2. No será eficiente.

Puede usar el método .resize() de ndarrays. Requiere que otras matrices / variables no hagan referencia a la memoria.

 import numpy as np ret = np.array([]) for i in range(100): tmp = np.random.rand(np.random.randint(1, 100)) ret.resize(len(ret) + len(tmp)) # <- ret is not referred to by anything else, # so this works ret[-len(tmp):] = tmp 

La eficiencia se puede mejorar utilizando los esquemas de sobrerrucación habituales de memoria de matriz.

La forma habitual de manejar esto es algo como esto:

 import numpy as np ret = [] for i in range(100000): tmp = get_input(i) ret.append(np.zeros(len(tmp))) ret.append(np.zeros(fixed_length)) ret = np.concatenate(ret) 

Por razones que otras respuestas han entrado, en general es imposible extender una matriz sin copiar los datos.