答案 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
,_id
和rec.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}}应该很好地为您服务。希望这能让你走上正确的轨道。