Подтвердить что ты не робот

Быстрый n-мерный разреженный массив в Python/Cython

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

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

Мне тоже нужно:

  • пакет python для n-мерных массивов с векторизованным get и set или
  • библиотека c для разреженных массивов, с которыми я могу легко получить доступ с помощью Cython или
  • некоторый вариант "сворачивать свой собственный", который, как я полагаю, потребует c-эквивалент питона python

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

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

4b9b3361

Ответ 1

Если вы решите пойти с опцией C dict, вы можете использовать std:: map С++ 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