Python / Cython 中的快速 n 维稀疏数组

23

我有一个涉及非常稀疏的大n维数组的应用程序。 scipy.sparse 有一个有用的“矢量化获取和设置”功能,因此可以使用Cython快速填充稀疏矩阵。

当然,scipy包无法处理n维。我发现两个能够在Python中处理n维稀疏数组的软件包sparrayndsparse。但似乎都没有向量化的获取和设置功能。

因此我需要:

  • 具有矢量化get和set的n维数组的Python软件包或
  • 适用于稀疏数组的C库,我可以轻松地通过Cython访问或
  • 一些“自己动手”的选择,我想这需要一个C等效物来替代Python字典

对于我的目的,我认为将n维坐标映射回1或2维可能会起作用。更好的方法是拥有一个相当于Python字典的dict等效物,我可以在Cython循环内快速访问。我假设这排除了Python dict

请问是否有人能给我一个如何在Cython中使用c++ map对象的示例?


15
像这样的问题,我不同意“要求我们推荐或寻找工具、库或喜爱的外部资源是不合适的”关闭理由。这个人显然已经做了他的研究,还能做什么呢? - Jonathon Reinhart
1
抱歉,我没有意识到这是个问题。我想我可以提出论点,我不仅仅是想要一个库,而是希望得到一些关于如何自己完成这个任务的建议。 - Neal Hughes
8
关闭问题的原因是因为那些毫无价值的“开发者”不断地发布一些只问“如何使用jQuery制作zip文件,请给我代码”的问题。但在这种情况下,我相信这是一个完全有效的、经过充分研究的问题。+1。 - Jonathon Reinhart
@JonathonReinhart:对你的评论点赞。我也同意。 - Yavar
在您的列表中添加另一个选项:将“n”维坐标转换为“2”维坐标,反之亦然。我怀疑这将破坏(或至少降低)向量化获取和设置的价值,但您可能需要验证一下。 - High Performance Mark
1
这种问题确实是一个问题,因为如果按照规则严格执行,它应该被关闭。 - Ivan
1个回答

5
如果您决定选择C dict选项,您可以使用C++ STL的std::map。很难找到比实现字典/映射更快或更健壮的本地代码。
cppmap.pyx:
# distutils: language = c++

cdef extern from "<map>" namespace "std":
    cdef cppclass mymap "std::map<int, float>":
        mymap()
        float& operator[] (const int& k)

cdef mymap m = mymap()
cdef int i
cdef float value

for i in range(100):
    value = 3.0 * i**2
    m[i] = value

print m[10]

setup.py:

from distutils.core import setup
from Cython.Build import cythonize
setup(name = "cppmapapp"
  ext_modules = cythonize('*.pyx'))

命令行:

$ python setup.py build
$ cd build/lib.macosx-10.5-x86_64-2.7
$ python -c 'import cppmap'
300.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接