从Mongo获取字典并使用Numpy转换为ndarray

时间:2019-06-20 09:41:55

标签: python arrays mongodb numpy

我在Mongo中有一个汇总查询,返回的数据如下:

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

我想对a,b和c进行FFT,我需要将数据放入3个numpy数组中,如下所示:

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

使用numpy进行此操作的最佳选择是什么,因为现在我正在执行for循环,并且需要花一些时间。

更新:

mongo的结果是一个可迭代的游标 我现在的操作方式是这样的:

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

2 个答案:

答案 0 :(得分:2)

假设您有来自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 :(得分:1)

似乎数据以一种可以轻松进入大熊猫的格式提供,并且从那里开始,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'])