我目前正在调查是否可以或多或少地直接使用structured numpy arrays作为mongodb插入操作的文档。
在我找到的所有例子中
db.collection.insert(doc)
doc
始终是Python dict
,但我想知道是否所有提供mapping interface的实例都可用于插入操作。
我正在考虑使用DictMixin或MutableMapping对np.ndarray进行子类化,因此它确实提供了一个dict接口。然后做这样的事情:
structured_array = np.zeros( (5,), dtype=[('i', '<i4'), ('f', '<f4')] )
structured_array['i'] = np.random.randint(42, size=5)
structured_array['f'] = np.random.rand(5)
for row in structured_array:
# row is of type: np.void
# so in order to let pymongo insert it into the DB, I create a
# view of row, which provides the dict-like interface
row_dict_like = row.view(np_array_subclass_providing_dict_interface)
db.collection.insert(row_dict_like)
现在,因为我是一个血腥的初学者,并且从未进行过np.ndarray的分类,并担心我可能会花费很多时间进入这个,只是为了稍后学习,整个方法并不是很聪明,我的问题是: 你认为这种方法存在重大问题吗?它是Pythonic吗?我的假设是,任何提供映射接口的类都可以用于mongodb插入操作,完全正确吗?
答案 0 :(得分:1)
毫无疑问,你的问题应该得到一个纯粹的&#34; python / numpy-only answer,我相信其他人会提供。但是:
我想指出,在许多情况下,如果你发现numpy界面繁琐和/或不直观,使用熊猫可以让你的生活更轻松。
在您的示例中,利用pandas的一种方法是创建DataFrame
,并使用iterrows()
对其行进行迭代。每行都是(或多或少)类似dict的对象。
import pandas as pd
df = pd.DataFrame.from_records(structured_array)
for i, row in df.iterrows():
print row.iteritems()
[('i', 14.0), ('f', 0.099248834)]
[('i', 31.0), ('f', 0.69031882)]
[('i', 32.0), ('f', 0.85714084)]
[('i', 14.0), ('f', 0.64561093)]
[('i', 8.0), ('f', 0.18835814)]
for i, row in df.iterrows():
print dict(row)
{'i': 14.0, 'f': 0.099248834}
{'i': 31.0, 'f': 0.69031882}
{'i': 32.0, 'f': 0.85714084}
{'i': 14.0, 'f': 0.64561093}
{'i': 8.0, 'f': 0.18835814}
但是,您可能需要考虑重构代码以开始使用DataFrame
,这比recarray
更直观。
当然,这需要你安装一般的高度推荐的熊猫。