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.
Ö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