numpy:是否有任何驱动程序从mongodb加载数据?

时间:2012-03-30 20:50:46

标签: python mongodb numpy

  • 我在mongo有一个大集合
  • 我想在numpy ndarray中加载数据
  • 有没有办法从mongodb加载数据而不通过pymongo迭代。像R-Mongo
  • 之类的东西

1 个答案:

答案 0 :(得分:0)

接下来有几个假设,其中大部分都与您的文档“架构”有关。根据定义的程度,即嵌套程度,预期类型和键数等,您可以使用快捷方式将集合转换为numpy rec.array。因此,我将尝试更多地关注该方法,而不是覆盖所有可能的转换案例,以便让您了解如何开始。例如,给定一个如下所示的mongo文档:

tdict = {'A': 151,
         'B': 'somestring',
         'C': [1, 2, 3],
         '_id': ObjectId('4edd4e4367fbe05022000034')}

或此类文件的清单:

tlist = [{'A': 151,
          'B': 'somestring',
          'C': [1, 2, 3],
          '_id': ObjectId('4edd4e4367fbe05022000034')},
         {'A': 151,
          'B': 'somestring',
          'C': [1, 2, 3],
          '_id': ObjectId('4edd4e4367fbe05022000034')}]

可用于将此列表转换为numy rec.array的函数可能如下所示:

import numpy as n

def DictToRecArray(data, columnNames=[]):
    result = None

    if data and isinstance(data, list) or isinstance(data, dict):
        data = [data] if isinstance(data, dict) else data
        if isinstance(data[0], dict):
            columnNames = map(str, data[0].keys()) if not columnNames else columnNames
            columns = [(str(c), type(data[0][c])) for c in columnNames]
            for i,clm in enumerate(columns):
                if clm[1].__name__ in ['str','unicode']:
                    maxlen = 0
                    for row in data:                    
                        maxlen = len(row[clm[0]]) if len(row[clm[0]]) > maxlen else maxlen
                    columns[i] = (clm[0], n.dtype('S%d' % maxlen,1))

            result = n.recarray((len(data)),dtype=columns)
            c_order = [c[0] for c in columns]
            for i,row in enumerate(data):
                for c in c_order:        
                    result[i][c] = row[c]

    return result

columnNames允许您选择文档中的键来生成rec.array,并将这些键的顺序定义为rec.array本身中的列。

如果您花一些时间查看DictToRecArray的实现,我之前关于假设的观点就会变得明显。例如,我本可以将list值视为将文档扩展为rec.array内多行的机会,即C tDict中的关键A复制键B_idrec.array的值,并生成形状等于(3,)(1,)的结果DictToRecArray。沿着这条路走下去,你会看到tlist的实现将与你的“架构”紧密耦合,我的实现可能会制造你的一些文件。尽管如此,在这种情况下,将DictToRecArray传递给rec.array([(151, [1, 2, 3], 'somestring', ObjectId('4edd4e4367fbe05022000034')), (151, [1, 2, 3], 'somestring', ObjectId('4edd4e4367fbe05022000034'))], dtype=[('A', '<i8'), ('C', '|O8'), ('B', '|S10'), ('_id', '|O8')]) 会导致:

data.frame

鉴于您正在寻找rec.array - 类型的结果,{{1}}应该很好地为您服务。希望这能让你走上正确的轨道。