CSC giữ một danh sách các chỉ mục hàng của tất cả các mục khác 0, định dạng CSR giữ một danh sách các chỉ mục cột của tất cả các mục khác 0. Tôi nghĩ bạn có thể tận dụng điều đó để trao đổi những thứ xung quanh như sau, và tôi nghĩ rằng không nên có bất kỳ tác dụng phụ với nó:
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)
Bây giờ bạn có thể làm một cái gì đó như thế này:
>>> 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.]])
Tôi đã sử dụng ma trận LIL để cho biết cách bạn có thể bảo toàn loại đầu ra của mình. Trong ứng dụng của bạn, bạn có thể muốn có định dạng CSC hoặc CSR và chọn xem có trao đổi các hàng hoặc cột đầu tiên dựa trên nó hay không, để giảm thiểu chuyển đổi.
Tôi cần điều này để thực hiện cụ thể. Tuy nhiên, như một đồng nghiệp đã chỉ ra cho tôi, nói chung, người ta sẽ không làm hoán vị trên một ma trận thưa thớt. Ma trận thưa thớt 'A' thường được sử dụng làm bản đồ tuyến tính' y = Axe', ví dụ: trong các giải pháp lặp lại. Do đó việc hoán đổi này được thực hiện tốt hơn bằng cách viết một trình bao bọc xung quanh 'A', hoán đổi các mục của vectơ đầu vào x (đây là cột hoán đổi trong' A') hoặc các mục của 'y' (đây là hoán đổi hàng). – Jan