#python #arrays #list #numpy
#python #массивы #Список #numpy
Вопрос:
У меня есть функция, которая возвращает массив, и я хочу продолжать вызывать эту функцию с другим параметром, а затем продолжать добавлять результирующий массив в течение цикла for . Прямо сейчас я просто определяю список и добавляю новый массив в список, а затем складываю все это в конце. Это кажется очень неэффективным.
Вот пример: здесь я только что определил массив с помощью numpy random.rand, чтобы показать тип массива, который должен быть возвращен, а затем добавлен.
import numpy as np
total = 3
rows = 3
my_list = []
for i in range(total):
output_array = np.random.rand(rows,2) # this could be variable
my_list.append(output_array)
final_array = np.vstack(my_list)
Есть ли более эффективный способ сделать это, чтобы я мог просто добавить непосредственно к массиву и получить окончательный полный массив в конце? Проблема в том, что я не знаю заранее определенное количество раз, когда я буду перебирать список, Поэтому я не могу использовать конкатенацию и т. Д.
Комментарии:
1. Как вы думаете, почему добавление списка неэффективно? Вы понимаете, как вещи добавляются в список? Или что массивы не могут расти таким же образом?
2. «Прямо сейчас я просто определяю список и добавляю новый массив в список, а затем складываю все это в конце. Это кажется очень неэффективным «. Нет, на самом деле это эффективный способ сделать это . Вы не можете
.append
использовать массив на месте, это массив , а не список. Sonumpy.ndarray.append
создает новый массив , но это вынуждает вас использовать алгоритм квадратичного времени. Ваш подход к списку — линейное время.3. @Pygirl это в точности эквивалентно тому, что они уже делают…
4. @hpaulj: Нет, я не говорил, что список добавляется, если это эффективно. Я только что предложил сделать его более питоническим. Я не могу придумать никакого улучшения для этого, поскольку itertools.chain не будет оптимизировать. Я думаю, это нормально.
5. @Pygirl, на практике функция, создающая массив, вероятно, будет достаточно сложной, чтобы разница во времени между циклом добавления и пониманием списка была незначительной. OP ищет что-то, что «увеличивает» массив с большей эффективностью (его нет).
Ответ №1:
Списки предназначены для эффективного добавления, хранения объектов по ссылке в буфере с возможностью расширения.
Массивы растут только за счет создания нового массива, требующего полной копии. Это лучше всего делать один раз для всего списка. Итеративное объединение требует гораздо большего копирования.
Но не стесняйтесь проводить свои собственные временные тесты.