Как мне построить массив из генератора?

143
задан saffsd 15 December 2008 в 05:44
поделиться

3 ответа

Массивы Numpy требуют, чтобы их длина была установлена явно во время создания, в отличие от списков Python. Это необходимо так, чтобы место для каждого объекта могло быть последовательно выделено в памяти. Последовательное выделение является основной характеристикой массивов numpy: это объединилось с операциями реализации собственного кода, которым позволяют, на них выполниться намного более быстрый, чем обычные списки.

Иметь это в виду, технически невозможно взять объект генератора и превратить его в массив если Вы также:

  1. может предсказать, сколько элементов это уступит, когда выполнено:

    my_array = numpy.empty(predict_length())
    for i, el in enumerate(gimme()): my_array[i] = el
    
  2. готовы сохранить его элементы в промежуточном списке:

    my_array = numpy.array(list(gimme()))
    
  3. может сделать два идентичных генератора, пробежать первый, чтобы найти общую длину, инициализировать массив и затем пробежать генератор снова для нахождения каждого элемента:

    length = sum(1 for el in gimme())
    my_array = numpy.empty(length)
    for i, el in enumerate(gimme()): my_array[i] = el
    

1 , вероятно, что Вы ищете. 2 неэффективное пространство, и 3 время неэффективный (необходимо пройти генератор дважды).

116
ответ дан Cristian Ciupitu 15 December 2008 в 05:44
поделиться

Один Google позади этого результата stackoverflow, я нашел, что существует numpy.fromiter(data, dtype, count) . Значение по умолчанию count=-1 берет все элементы от повторяемого. Это требует dtype быть установленным явно. В моем случае это работало:

numpy.fromiter(something.generate(from_this_input), float)

187
ответ дан user2357112 15 December 2008 в 05:44
поделиться

Несколько касательно, но если ваш генератор представляет собой понимание списка, вы можете использовать numpy.where для более эффективного получения результата (я обнаружил это в своем собственном коде, увидев этот пост)

6
ответ дан 23 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: