Forma óptima de añadir a la matriz numpy

Tengo una matriz numpy y simplemente puedo agregarle un elemento usando adjuntar, como este:

numpy.append(myarray, 1) 

En este caso acabo de añadir el entero 1 .

Pero, ¿es esta la forma más rápida de agregar a una matriz? Tengo una serie muy larga que llega a las decenas de miles.

¿O es mejor indexar la matriz y asignarla directamente? Me gusta esto:

 myarray[123] = 1 

Anexar a las matrices numpy es muy ineficiente. Esto se debe a que el intérprete necesita encontrar y asignar memoria para toda la matriz en cada paso. Dependiendo de la aplicación, hay estrategias mucho mejores.

Si conoce la longitud de antemano, es mejor asignar previamente la matriz mediante una función como np.ones , np.zeros o np.empty .

 desired_length = 500 results = np.empty(desired_length) for i in range(desired_length): results[i] = i**2 

Si no conoce la longitud, probablemente sea más eficiente mantener sus resultados en una lista regular y luego convertirlos en una matriz.

 results = [] while condition: a = do_stuff() results.append(a) results = np.array(results) 

Aquí hay algunos tiempos en mi computadora.

 def pre_allocate(): results = np.empty(5000) for i in range(5000): results[i] = i**2 return results def list_append(): results = [] for i in range(5000): results.append(i**2) return np.array(results) def numpy_append(): results = np.array([]) for i in range(5000): np.append(results, i**2) return results %timeit pre_allocate() # 100 loops, best of 3: 2.42 ms per loop %timeit list_append() # 100 loops, best of 3: 2.5 ms per loop %timeit numpy_append() # 10 loops, best of 3: 48.4 ms per loop 

Así que puedes ver que tanto la asignación previa como el uso de una lista y la conversión son mucho más rápidos.

Si conoce el tamaño de la matriz al final de la ejecución, será mucho más rápido asignar previamente una matriz del tamaño apropiado y luego establecer los valores. Si necesita adjuntarlo sobre la marcha, es probable que sea mejor tratar de no hacer este elemento a la vez, en lugar de agregar la menor cantidad de veces posible para evitar generar muchas copias una y otra vez. También es posible que desee hacer un perfil de la diferencia en los tiempos de np.append , np.hstack , np.concatenate . etc.