2013-11-21 16 views
22

私は非常に疎な大きなn次元配列を含むアプリケーションを持っています。 scipy.sparseには便利な「ベクター化された取得と設定」機能があり、Cythonを使用して疎な行列に素早く移入することができます。Python/Cythonの高速n次元スパース配列

もちろん、scipyパッケージではn次元は処理できません。 n次元の疎配列をPython sparrayndsparseで実行した2つのパッケージがあります。しかし、どちらもベクトル化された機能を設定していないようです。

だから私はどちらかが必要です。私はCythonまたは

  • 一部で簡単にアクセスすることができスパース配列のためのベクトル化getおよびsetまたは
    • のn次元配列のためのpythonパッケージ
    • 交流Library」を

    私の目的のためには、n次元の座標を1次元または2次元に戻すことができると思います。何が良いだろうが、私はCythonループ内で高速にアクセスできるdictを持つことです。私はこれがPython dictを除外すると仮定します。

    誰かが私にCython内からのC++マップオブジェクトの使用方法の例を教えてくれるのだろうか?

    +13

    私がお勧めする私たちを求め '"に反対するときには、このような質問ですまたはツール、図書館、またはお気に入りのオフサイトリソースが、トピック外の「close reason」であることがわかります。男は明らかに彼の研究をした、他に何ができますか? –

    +1

    申し訳ありませんが、これは問題であるとは気づきませんでした。私は主張することができると思う、私は図書館の後ではないが、これを自分で行う方法に関するヒント。 –

    +8

    「jquery show me teh codez plzを使ってzipファイルを作るにはどうすればよいのですか?」という質問を何度も投稿する価値のない「開発者」のために、近い理由があります。しかし、この場合、これは完全に有効で、よく研究された質問だと私は信じています。 +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 
    
    関連する問題