La forma recomendada de hacer esto consiste en asignar previamente antes del bucle y el uso de rebanado y la indexación para insertar
my_array = numpy.zeros(1,1000)
for i in xrange(1000):
#for 1D array
my_array[i] = functionToGetValue(i)
#OR to fill an entire row
my_array[i:] = functionToGetValue(i)
#or to fill an entire column
my_array[:,i] = functionToGetValue(i)
numpy qué proporcionar un método array.resize()
, pero esto será mucho más lento debido al coste de reasignando la memoria dentro de un bucle. Si tiene tiene tiene flexibilidad, entonces me temo que la única manera es crear un array
desde un list
.
EDITAR: Si le preocupa que esté asignando demasiada memoria para sus datos, usaría el método anterior para asignar en exceso y luego, cuando termine el ciclo, corte los bits no utilizados de la matriz usando array.resize()
. Esto será , lejos más rápido que la reasignación constante de la matriz dentro del ciclo.
EDIT: En respuesta al comentario de @ user248237, suponiendo que conoce cualquiera de las dimensiones de la matriz (para simplificar):
my_array = numpy.array(10000, SOMECONSTANT)
for i in xrange(someVariable):
if i >= my_array.shape[0]:
my_array.resize((my_array.shape[0]*2, SOMECONSTANT))
my_array[i:] = someFunction()
#lop off extra bits with resize() here
El principio general es "asignar más de lo que cree que necesitará, y si las cosas cambian, cambie el tamaño de la matriz lo menos posible ". Duplicar el tamaño podría considerarse excesivo, pero de hecho este es el método utilizado por varias estructuras de datos en varias bibliotecas estándar en otros idiomas (java.util.Vector
lo hace de forma predeterminada, por ejemplo. Creo que varias implementaciones de std::vector
en C++ también lo hacen)
lo que sucede si no lo haces? – OscarRyz
La razón por la que numpy es tan rápido en primer lugar es que opera con matrices de tamaño constante y no listas dinámicas. Así que deshacerse de él solo para reducir el "desorden" en su código probablemente no sea el camino correcto. Si conoce el tamaño de antemano (1000) preasignelo. Si no lo hace, crear la lista es definitivamente la mejor manera de hacerlo, ya que las listas de python [] son bastante eficientes. – drozzy