22

非常にまばらな大規模な n 次元配列を含むアプリケーションがあります。scipy.sparseには便利な「ベクトル化された取得と設定」機能があるため、Cython を使用してスパース行列をすばやく作成できます。

もちろん、scipy パッケージは n 次元を処理できません。私が見つけた 2 つのパッケージは、Pythonsparrayndsparse. ただし、ベクトル化された取得および設定機能もないようです。

したがって、次のいずれかが必要です。

  • ベクトル化された get および set または
  • Cython または
  • 私が推測するいくつかの「独自のロール」オプションには、python dictに相当するacが必要です

私の目的のために、n 次元の座標を 1 次元または 2 次元に戻すとうまくいくと思います。ただし、Cythonループ内で高速にアクセスできるdictに相当するものを用意することをお勧めします。これで python が除外されると思いdictます。

Cython 内から c++ マップ オブジェクトを使用する方法の例を教えてもらえないでしょうか?

4

1 に答える 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
于 2013-11-27T11:48:00.263 に答える