2013-11-21 4 views
22

나는 매우 드문 드문 큰 n 차원 배열을 포함하는 응용 프로그램을 가지고 있습니다. scipy.sparse에는 유용한 '벡터화 된 가져 오기 및 설정'기능이 있으므로 Cython을 사용하여 스파 스 매트릭스를 빠르게 채울 수 있습니다.Python/Cython에서 빠른 n 차원 희소 배열

물론 scipy 패키지는 n 차원을 처리 할 수 ​​없습니다. 파이썬 sparrayndsparse에서 n 차원 희소 배열을 찾은 두 개의 패키지가 있습니다. 그러나 그것은 어느 것도 벡터화 된 가져 오기 및 설정 기능이없는 것으로 보입니다.

그래서 내가 필요 하나 :

  • 벡터화 GET와 N 차원 배열 및 설정하거나 내가 쉽게 몇 가지를 사이 썬에 액세스하거나
  • 수 스파 스 배열
  • 교류 라이브러리에 대한 파이썬 패키지 ' 내 생각에 필자가 생각하기에 파이썬 dict에 상응하는 ac 옵션이 필요하다.

제 생각에 n 차원 좌표를 1 또는 2 차원으로 다시 매핑하는 것이 효과적 일 것이라고 생각합니다. 어떤 것이 더 좋을 지 모르지만 Cython 루프에서 빠르게 액세스 할 수있는 동등한 기능을 제공하는 것입니다. 이 규칙은 파이썬 dict을 제외한다고 가정합니다.

누군가 Cython 내에서 C++ 맵 객체를 사용하는 방법에 대한 예제를 제공 할 수 있을지 궁금하십니까?

+13

나는' "추천 우리를 요청에 동의 할 때이 같은 질문입니다 또는 도구, 도서관 또는 좋아하는 오프 사이트 리소스를 찾을 수없는 주제 ""가까운 이유입니다. 그 남자는 분명히 자신의 연구를했으며, 그 밖에 무엇을 할 수 있습니까? –

+1

죄송합니다. 이것이 문제라는 것을 깨닫지 못했습니다. 내가 주장 할 수 있겠지만, 나는 도서관을 다룬 것이 아니라이 일을 스스로하는 방법에 대한 조언을하고있다. –

+8

닫기 이유는 "jquery show me teh codez 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