Python / Cython での高速な n 次元スパース配列 質問する

Python / Cython での高速な n 次元スパース配列 質問する

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

sparrayもちろん、scipy パッケージは n 次元を処理できません。Pythonとで n 次元のスパース配列を処理するパッケージが 2 つ見つかりましたndsparse。ただし、どちらにもベクトル化された取得および設定機能がないようです。

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

  • ベクトル化されたgetとsetを持つn次元配列用のPythonパッケージまたは
  • Cythonや
  • '自分で作る' オプションには、Python の辞書に相当する ac が必要になると思います。

私の目的には、n 次元座標を 1 次元または 2 次元にマッピングするとうまくいくと思います。ただし、Cython ループ内で高速にアクセスできる dict 相当のものがあればもっと良いでしょう。これにより、python は除外されると思いますdict

Cython 内から C++ マップ オブジェクトを使用する方法の例を教えていただけませんか?

ベストアンサー1

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]

セットアップ.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

おすすめ記事