2013-05-24 2 views
0

Как вы вставляете новый элемент в массив numpy в постоянное время.Добавление к массиву numpy в постоянное время

В списке python есть метод append, который делает это, что эквивалентно в numpy. Похоже, numpy.append возвращает копию массива и занимает линейное время.

+1

Если вы не беспокоитесь о памяти, вы можете создать нечто вроде 'a = numpy.zeros (10000)', заполнить это нумерами, которые вы хотите по ходу дела, и когда вы закончите «добавление» своего ' N' для этого массива, выполните 'a = a [: N]'. Затем вы будете делать только одну копию вместо копий «N». Конечно, выберите размер начального пустого массива, который будет больше, чем вы ожидаете от 'N'. – SethMMorton

+0

numpy использует фиксированный (и точный) массив. добавление к такому массиву всегда o (n) – njzk2

ответ

1

Отзывы пользователей о вопросе верны: массивы numpy отличаются от списков Python, поэтому метод добавления numpy часто не является хорошим выбором. Это может быть особенно сложно при попытке добавить к массиву numpy быстро. Метод append для массива numpy возвращает копию массива с добавленными в конец новыми элементами. This answer имеет большой список предложений по методам Numpy, которые можно использовать для этого, и справедливо упоминает, что лучший способ сделать это - сначала выделить массив с его окончательным размером. Для случаев, когда (1) Я не знаю, что окончательный размер массива должен быть и (2), мне нужно более высокую производительность, которую я часто использую,

a.resize(np.size(a) + 1, refcheck=False) 
a[-1] = foo 

где a является Numpy массив. Осторожно! a.resize - это не то же самое, что и np.resize(a, ...). Если размер массива можно изменить без его перемещения, эта операция выполняется быстро. Поскольку массив может быть перемещен путем изменения размера, ссылки на массив (например, выполнение b = a перед изменением размера) не будут безопасными после изменения размера. Обычно я устанавливаю refcheck=False, но затем я не буду использовать какие-либо массивы, которые могли бы ссылаться на a перед изменением размера.

Смежные вопросы