非常に疎な大規模な 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