python - 将 numpy 结构化数组的字段插入 mongodb

标签 python arrays mongodb numpy pymongo

我目前正在研究是否可以使用 structured numpy arrays或多或少直接作为 mongodb 插入操作的文档。

在我找到的所有例子中

db.collection.insert(doc)

doc 始终是 Python dict,但我想知道是否没有提供 mapping interface 的实例可能可用于插入操作。

我正在考虑使用 DictMixin 对 np.ndarray 进行子类化或 MutableMapping所以它真的提供了一个dict接口(interface)。然后做这样的事情:

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 的吗?我的假设是,任何提供映射接口(interface)的类都可以用于 mongodb 插入操作,是否完全正确?

最佳答案

毫无疑问,您的问题值得一个“纯粹”的 python/numpy-only 答案,我相信其他人会提供这个答案。但是:

我想指出的是,在您发现 numpy 的界面繁琐和/或不直观的许多情况下,使用 pandas 可以让您的生活更轻松。

在您的示例中,利用 pandas 的一种方法是创建一个 DataFrame,然后使用 iterrows() 遍历其行。每行都是一个(或多或少)类似字典的对象。

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 更直观。

当然,这需要你安装pandas,一般强烈推荐。

关于python - 将 numpy 结构化数组的字段插入 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26323054/

相关文章:

php - MongoDB 更新替换文档

python - 通过获取 Pandas 组计数的最大值来分配列值

MongoDB ObjectId外键实现推荐

python - 修改数据框中的多行

javascript - 在 Angularjs 中维护表示选项索引的整数数组

c++ - 如何将指针地址转换为无符号字符数组?

arrays - 在 Julia 中以并行方式计算数组

node.js - 使用redis发送好友状态

python - 获取视频剪辑的最后一帧并使用 moviepy 延长 10 秒

python - 在 Shapely 中查找距路线起点的坐标距离