Быстрый n-мерный разреженный массив в Python / Cython
У меня есть приложение, которое включает в себя большие n-мерные массивы, которые очень редки. scipy.sparse
имеет полезную функцию "векторизации получения и настройки", так что Cython может использоваться для быстрого заполнения разреженной матрицы.
Конечно, пакет scipy не может обрабатывать n-размеры. Я нашел два пакета, которые делают n-мерные разреженные массивы в Python sparray
а также ndsparse
, Однако, похоже, ни одна из них не имеет векторизованной функции получения и настройки.
Так что мне нужно либо:
- пакет python для n-мерных массивов с векторизацией get и set или
- библиотека AC для разреженных массивов, к которым я могу легко получить доступ с помощью Cython или
- какая-то опция 'roll your own', которая, я думаю, потребует переменного эквивалента для python dict
Для моей цели я думаю, что отображение координат n-измерения обратно в 1 или два измерения может работать. Что было бы лучше, тем не менее, это иметь точный эквивалент, который я могу быстро получить доступ в цикле Cython. Я предполагаю, что это исключает питона dict
,
Хотите знать, кто-то может дать мне пример того, как использовать объект карты C++ изнутри Cython?
1 ответ
Если вы решили использовать опцию 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