2013-11-21 30 views
22

Çok seyrek olan büyük n boyutlu dizileri içeren bir uygulamam var. scipy.sparse, 'vectorized alma ve ayarlama' özelliğine sahiptir, böylece Cython bir seyrek matrisi hızlı bir şekilde doldurmak için kullanılabilir.Python/Cython'da hızlı n boyutlu seyrek dizi

Tabii ki scipy paketi n boyutlarını kaldıramaz. Python sparray ve ndsparse n-boyutlu seyrek dizileri yapan bulduğum iki paket vardır. Ancak, vectorized alma ve ayarlama özelliği yok gibi görünüyor.

yüzden gerek ya:

  • vectorized get n boyutlu diziler ve ayarlamak veya kolayca bazı Cython ile erişmek veya
  • olabilir seyrek diziler için
  • ac kütüphanesi için bir piton paketi ' Ben işe yarayabilir geri 1 veya iki boyuta koordinatları benim amaç ben n-boyut haritalama düşünüyorum için python dict

AC tüketmek gerekiyor sanırım kendi' seçeneğini yuvarlayın. Yine de daha iyi olurdu, bir Cython döngüsünde hızlıca erişebilmem için bir dict eşdeğerine sahip olmak. Bu kuralları python dict üzerinden kabul ediyorum.

C++ harita nesnesinin Cython içinden nasıl kullanılacağı konusunda bana bir örnek verebilir misiniz?

+13

ben '" tavsiye etmek bize soran katılmıyorum zamanda gibidir soru yeter ya da bir araç bulmak, kütüphane ya da favori off-site kaynağı off-topic "' yakın sebeptir. Adam açıkçası araştırmasını yaptı, başka ne yapabilir? –

+1

Üzgünüz, bunun bir problem olduğunu anlamadım. Sanırım tartışabilirim, sadece bir kütüphaneden sonra değil, kendim nasıl yapılacağına dair herhangi bir ipucum var. –

+8

Yakın nedeni, sürekli olarak "hiçbir şey sormadan soru sormak", "jquery kullanarak zip dosyası nasıl yapılır?" Fakat bu durumda, bunun tamamen geçerli, iyi araştırılmış bir soru olduğuna inanıyorum. +1. –

cevap

5

C dict seçeneği ile devam etmeye karar verirseniz, C++ STL'nin std :: haritasını kullanabilirsiniz. Bir sözlük/harita uygulayan daha hızlı veya daha güçlü bir yerel kod bulmanız olası değildir.

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')) 

Komut satırı:

$ python setup.py build 
$ cd build/lib.macosx-10.5-x86_64-2.7 
$ python -c 'import cppmap' 
300.0