Загрузить данные из генератора в уже выделенный массив - PullRequest
4 голосов
/ 30 апреля 2019

У меня есть большой массив

data = np.empty((n, k))

, где n и k большие.У меня также есть много генераторов g, каждый из которых содержит k элементов, и я хочу загрузить каждый генератор в строку в data.Я могу сделать:

data[i] = list(g)

или что-то подобное, но это делает копию данных в g.Я могу загрузить цикл for:

for j, x in enumerate(g):
    data[i, j] = x

, но мне интересно, есть ли у numpy способ сделать это уже без копирования или зацикливания в Python.

Я знаю, что gимейте длину k заранее, и я буду рад сделать некоторые исправления подкласса __len__ при необходимости.np.fromiter примет что-то подобное при создании нового массива, но я бы предпочел загрузить этот уже существующий массив, если это возможно, из-за ограничений моего контекста.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Пара вещей здесь:

1) Вы можете просто сказать

for whatever in g:
  do_stuff

Поскольку g является генератором, цикл for понимает, как получить данные из генератора.

2) Вам не нужно будет обязательно «копировать» из генератора (так как он не имеет загруженной в память всей последовательности в соответствии с дизайном), но вам нужно будет пройти через нее, чтобы заполнитьдо вашей клевой структуры данных.Возможно, вам удастся выжать некоторую производительность (поскольку ваши структуры большие) с инструментами в numpy или itertools.

Таким образом, ответ «нет», поскольку вы используете генераторы.Если вам не нужно, чтобы все данные были доступны одновременно, вы можете просто использовать генераторы, чтобы сохранить небольшой объем памяти, но у меня нет контекста для того, что вы делаете с данными.

0 голосов
/ 30 апреля 2019

Нет более быстрого способа, чем те, которые вы описали.Вы должны выделить каждый элемент массива numpy либо путем итерации генератора, либо путем выделения всего списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...