2013-11-21 50 views
22

我有一個應用程序涉及非常稀疏的大型n維數組。 scipy.sparse有一個有用的'矢量化獲取和設置'功能,因此可以使用Cython快速填充稀疏矩陣。在Python/Cython中的快速n維稀疏數組

當然,scipy軟件包不能處理n維。我發現有兩個軟件包可以在python sparrayndsparse中執行n維稀疏數組。但是,它似乎沒有矢量化獲取和設置功能。

所以我需要兩種:

  • Python包用於n維數組與矢量get和set或
  • 稀疏陣列,我可以很容易地用Cython訪問或
  • 一些交流庫「滾你自己的'選項,我想這將需要交流相當於一個python字典

爲我的目的,我認爲映射n維座標回1或2維可以工作。有什麼更好的是有一個字典相當於我可以在Cython循環內快速訪問。我認爲這排除了python dict

想知道如果有人可以給我一個如何使用從Cython內的c + +地圖對象的例子?

+13

是這樣的問題,當我用'「要求我們不同意推薦或者找到一個工具,圖書館或者最喜歡的非現場資源都是脫離主題的「關閉原因」。這個人顯然做了他的研究,還能做什麼? –

+1

對不起,我沒有意識到這是一個問題。我想我可以爭辯說,我不只是在圖書館之後,而且還有關於如何自己做這些的技巧。 –

+8

這個密切的原因是因爲毫無價值的「開發人員」,他們不斷髮問,但只是「我如何使用jquery顯示我的代碼plz」來製作zipfile。但在這種情況下,我相信這是一個非常有效的,經過深入研究的問題。 +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