Получить дикт из Mongo и преобразовать в ndarray с помощью Numpy - PullRequest
2 голосов
/ 20 июня 2019

У меня есть агрегированный запрос в Mongo, который возвращает данные, такие как:

{a: 1, b: 2, c: 3}
{a: 4, b: 5, c: 6}
{a: 7, b: 8, c: 9}

Я хотел бы сделать БПФ для a, b и c, и мне нужно поместить данные в 3 массива, как это:

a = np.array([1, 4, 7])
b = np.array([2, 5, 8])
c = np.array([3, 6, 9])

Каков наилучший вариант сделать это, используя numpy, так как сейчас я делаю цикл for, и это занимает много лет.

ОБНОВЛЕНИЕ:

Результат от Монго - это итеративный Курсор. То, как я это делаю сейчас, выглядит так:

a = []
b = []
c = []
for item in aggregation_list:
    a.append(item['a'])
    b.append(item['b'])
    c.append(item['c'])

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Предполагая, что у вас есть список словарей из запроса MongoDB, вот как вы можете построить массив из его значений:

dicts = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6} ,{'a': 7, 'b': 8, 'c': 9}]

Вы можете распаковать разные строки в разные переменные, например, так (хотя это требуетпредварительное знание количества словарей, имеющее смысл только для нескольких словарей):

a,b,c = np.array(list(zip(*map(dict.values, dicts))))

print(a)
# [1 4 7]
...

Лучшим подходом было бы создание ndarray, где каждая строка содержит чередующиеся значения из значений вышеупомянутых словарей:

np.array(list(zip(*map(dict.values, dicts))))

array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
1 голос
/ 20 июня 2019

Похоже, что данные поступают в формате, который позволяет легко переходить в панды, и благодаря этому Pandas API намного быстрее, потому что вы можете векторизовать вместо цикла.

aggregation_list = [
    {a: 1, b: 2, c: 3}
    {a: 4, b: 5, c: 6}
    {a: 7, b: 8, c: 9}
]

df = pd.DataFrame.from_records(aggregation_list)

a = np.array(df['a'])
b = np.array(df['b'])
c = np.array(df['c'])

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