2013-03-01 13 views
5

Büyük ama seyrek dizilerim var ve bunları satırları bir sütunları değiştirerek yeniden düzenlemek istiyorum. Bunu scipy.sparse'da yapmanın iyi bir yolu nedir?Satırları ve sütunları değiştirerek seyrek dizileri yeniden düzenleme

Bazı konular

  • onlar sparsity yapısını değiştirmek rastgele sever olarak bu permutasyon matrisleri, bu görev için uygundur sanmıyorum. Ve bir manipülasyon her zaman gerekli olan birkaç değişiklik olsa bile, tüm sütunları veya satırları "çoğaltır".

  • Bu görev için scipy.sparse en iyi seyrek matris gösterimi nedir?

  • Uygulama için öneriler çok açıktır. Bu soru mutlaka belirli scipy olmayan bir cevap bulmak olabileceğinden

herkes, ben de Matlab ile bu etiketledi.

+0

Özel bir uygulama için buna ihtiyacım var. Ancak, bir meslektaşım bana işaret ettiği gibi, genel olarak, seyrek bir matris üzerinde bir şey yapmazdı. Seyrek bir matris "A" genellikle doğrusal bir harita olarak kullanılır; y = Ax', ör. yinelemeli çözücüler. Böylelikle, bu takas işlemi, A 'etrafında bir sarmalayıcı yazılarak, giriş vektörünün x girişlerinin değiştirilmesi (bu,' A 'sütununun değiştirilmesidir) veya' y 'girişleri (satır sırasını değiştirir) ile daha iyi gerçekleştirilir. – Jan

cevap

4

CSC formatını Sıfır olmayan girişlerin satır indekslerinin listesini tutar, CSR formatı, sıfır olmayan tüm girişlerin sütun indekslerinin bir listesini tutar. Ben aşağıdaki gibi etrafında şeyleri takas etmek o yararlanabilir düşünüyorum ve bunun için herhangi bir yan etkisi bulunmamakla olmaması gerektiğini düşünüyorum: Artık böyle bir şey yapabileceğini

def swap_rows(mat, a, b) : 
    mat_csc = scipy.sparse.csc_matrix(mat) 
    a_idx = np.where(mat_csc.indices == a) 
    b_idx = np.where(mat_csc.indices == b) 
    mat_csc.indices[a_idx] = b 
    mat_csc.indices[b_idx] = a 
    return mat_csc.asformat(mat.format) 

def swap_cols(mat, a, b) : 
    mat_csr = scipy.sparse.csr_matrix(mat) 
    a_idx = np.where(mat_csr.indices == a) 
    b_idx = np.where(mat_csr.indices == b) 
    mat_csr.indices[a_idx] = b 
    mat_csr.indices[b_idx] = a 
    return mat_csr.asformat(mat.format) 

:

>>> mat = np.zeros((5,5)) 
>>> mat[[1, 2, 3, 3], [0, 2, 2, 4]] = 1 
>>> mat = scipy.sparse.lil_matrix(mat) 
>>> mat.todense() 
matrix([[ 0., 0., 0., 0., 0.], 
     [ 1., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 1., 0., 1.], 
     [ 0., 0., 0., 0., 0.]]) 
>>> swap_rows(mat, 1, 3) 
<5x5 sparse matrix of type '<type 'numpy.float64'>' 
    with 4 stored elements in LInked List format> 
>>> swap_rows(mat, 1, 3).todense() 
matrix([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 1.], 
     [ 0., 0., 1., 0., 0.], 
     [ 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 
>>> swap_cols(mat, 0, 4) 
<5x5 sparse matrix of type '<type 'numpy.float64'>' 
    with 4 stored elements in LInked List format> 
>>> swap_cols(mat, 0, 4).todense() 
matrix([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 1., 0., 0.], 
     [ 1., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

Çıktınızın türünü nasıl koruyabileceğinizi göstermek için bir LIL matrisi kullandım. Uygulamanızda muhtemelen zaten CSC veya CSR biçiminde olmak ve dönüşümleri en aza indirgemek için önce satırları veya sütunları temel alarak takas mı yapacağınızı seçebilirsiniz.

+0

Teşekkürler @Jaime, bu aradığım şey gibi görünüyor. Ve seyrek formatlara daha fazla aşina olmam gerektiğini gösteriyor. – Jan

+0

@Jan Biraz daha test etmek isteyebilirsiniz, bence yukarıdaki örnekler işe yaramaz girişlerin hepsi aynıdır. Şu anda zamanım yok, ama daha sonra detaylı olarak inceleyeceğim. Biraz da değişime ihtiyaç duyabilecek başka bir dizi var, mat.indptr. [Yale seyrek formatındaki wikipedia makalesi] (http://en.wikipedia.org/wiki/Sparse_matrix#Yale_format) kendiniz denemek istediğinizde gerekli tüm bilgilere sahip! – Jaime

+0

Bunu test edip size bildireceğim ... Kaynak için teşekkürler. – Jan

0
Matlab içinde

sadece indeks sütunları ve satırları yolu sevebiliyorsun:

Matrix = speye(10); 
mycolumnorder = [1 2 3 4 5 6 10 9 8 7]; 
myroworder = [4 3 2 1 5 6 7 8 9 10]; 
Myorderedmatrix = Matrix(myroworder,mycolumnorder); 

olsa scipy hakkında bilmiyorum ... Bu kıtlık korur düşünüyorum ...

İlgili konular