Массивы Numpy требуют, чтобы их длина была установлена явно во время создания, в отличие от списков Python. Это необходимо так, чтобы место для каждого объекта могло быть последовательно выделено в памяти. Последовательное выделение является основной характеристикой массивов numpy: это объединилось с операциями реализации собственного кода, которым позволяют, на них выполниться намного более быстрый, чем обычные списки.
Иметь это в виду, технически невозможно взять объект генератора и превратить его в массив если Вы также:
может предсказать, сколько элементов это уступит, когда выполнено:
my_array = numpy.empty(predict_length())
for i, el in enumerate(gimme()): my_array[i] = el
готовы сохранить его элементы в промежуточном списке:
my_array = numpy.array(list(gimme()))
может сделать два идентичных генератора, пробежать первый, чтобы найти общую длину, инициализировать массив и затем пробежать генератор снова для нахождения каждого элемента:
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 время неэффективный (необходимо пройти генератор дважды).
Один Google позади этого результата stackoverflow, я нашел, что существует numpy.fromiter(data, dtype, count)
. Значение по умолчанию count=-1
берет все элементы от повторяемого. Это требует dtype
быть установленным явно. В моем случае это работало:
numpy.fromiter(something.generate(from_this_input), float)
Несколько касательно, но если ваш генератор представляет собой понимание списка, вы можете использовать numpy.where
для более эффективного получения результата (я обнаружил это в своем собственном коде, увидев этот пост)