2013-11-21 2 views
22

У меня есть приложение, которое связано с большими n-мерными массивами, которые очень разрежены. scipy.sparse имеет полезную функцию «векторизации получения и настройки», так что Cython можно использовать для быстрого заполнения разреженной матрицы.Быстрый n-мерный разреженный массив в Python/Cython

Конечно, пакет Scipy не может обрабатывать n-размеры. Есть два пакета, которые я нашел, которые делают n-мерные разреженные массивы в python sparray и ndsparse. Однако, похоже, он не имеет векторизованной функции получения и настройки.

Так что нужны либо:

  • питон пакет для п-мерных массивов с векторизованными получить и установить или
  • переменных библиотек для разреженных массивов, которые можно легко получить доступ с Cython или
  • некоторых ' roll your own ', который, я думаю, потребует переменного эквивалента python dict

Для моей цели я думаю, что отображение координат n-мер в один или два измерения может работать. Было бы лучше, хотя бы иметь эквивалент dict, который я могу получить быстро внутри цикла Cython. Я предполагаю, что это исключает питон dict.

Удивление, если кто-нибудь может дать мне пример того, как использовать объект карты C++ изнутри Cython?

+13

Это такие вопросы, как это, когда я не согласен с '" просят нас, чтобы рекомендовать или найти инструмент, библиотеку или любимый внешний ресурс вне темы «закрыть причину». Человек явно сделал свое исследование, что еще можно сделать? –

+1

Извините, я не понимал, что это проблема. Полагаю, я могу спорить, я не только после библиотеки, но и советы о том, как это сделать сам. –

+8

Близкая причина существует из-за бесполезных «разработчиков», которые постоянно публикуют вопросы, которые не задают ничего, кроме как «как сделать zipfile с помощью jquery show me tezzzzz plz». Но в этом случае я считаю, что это совершенно правильный, хорошо изученный вопрос. +1. –

ответ

5

Если вы решите пойти с опцией C dict, вы можете использовать std :: map C++ STL. Маловероятно, что вы найдете более быстрый или более надежный собственный код, который реализует словарь/карту.

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