Рекомендованным способом сделать это является предварительное выделение перед циклом и использование нарезки и индексации для вставки
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 обеспечивает метод array.resize()
, но это будет намного медленнее из-за стоимости перераспределения памяти внутри цикла. Если вы должны обладать гибкостью, то, боюсь, единственный способ - создать array
из list
.
РЕДАКТИРОВАТЬ: Если вы беспокоитесь о том, что вы выделяете слишком много памяти для своих данных, я бы использовал вышеописанный метод для перераспределения, а затем, когда цикл завершен, обрежьте неиспользуемые биты массива, используя 1013 *. Это будет далеко , далеко быстрее, чем постоянное перераспределение массива внутри цикла.
РЕДАКТИРОВАТЬ: В ответ на комментарий @ user248237, предполагая, что вы знаете одно измерение массива (для простоты):
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
Общий принцип: «выделите больше, чем вы думаете, и если что-то изменится, измените размер массива как можно меньше». Удвоение размера можно считать чрезмерным, но на самом деле этот метод используется несколькими структурами данных в нескольких стандартных библиотеках на других языках (например, java.util.Vector
делает это по умолчанию. Я думаю, что несколько реализаций std::vector
в C ++ сделайте это тоже).