Как записать разреженную матрицу в текстовый файл на python?

#python #sparse-matrix

#python #разреженная матрица

Вопрос:

У меня разреженная матрица как A_n. тип A_n — «scipy.sparse.csc.csc_matrix».

например, A_n — это:

 (16, 0) 1.0
(71, 1) 1.0
(74, 3) 1.0
(72, 12)    1.0
  .          .
  .          .
(32, 17)    1.0
(64, 17)    1.0
(53, 19)    1.0
(73, 20)    1.0
(52, 21)    1.0
(52, 22)    1.0
(44, 26)    1.0
(53, 26)    1.0
(87, 26)    1.0
  

Я хочу записать все A_n в текстовый файл на python следующим образом:

 16 0 1.0
71 1 1.0
74 3 1.0
.
.
  

или

 (16, 0) 1.0
(71, 1) 1.0
(74, 3) 1.0
.
.
  

Я был бы очень признателен, если бы вы направили меня

Комментарии:

1. Вам нужно получить к ней доступ впоследствии или вам нужно только записать ее в файл? Почему вы сохраняете ее в файл?

2. Что-то не так с двойным циклом for и последующей печатью строки в стандартный вывод, если установлен конкретный i,j элемент?

3. Я просто хочу записать ее в текстовый файл в той же форме, что и выше. затем я хочу открыть этот файл в Excel.

4. Нет, не существует. Каков его код?

Ответ №1:

Вы могли бы просто преобразовать объект spare matrix в строку, используя str(sparse_matrix) , а затем записать его в файл после изменения атрибута maxprint на spare_matrix.shape[0] .

 sparse_matrix.maxprint = sparse_matrix.shape[0]
with open("spare_matrix.txt","w") as file:
    file.write(str(sparse_matrix)) 
    file.close() 
  

Комментарии:

1. Этот код правильный, но не записывает все элементы матрицы в файл. этот код игнорирует некоторые строки и заменяет их на «: :».Например, между двумя строками (72, 12) и (32, 17) в A_n был написан знак «: :».

2. Я обновил приведенный выше код и изменил атрибут maxprint перед преобразованием в строку, это должно решить проблему. Мне пришлось прочитать исходный код scipy для этого xD. Надеюсь, это поможет вам

3. Это все еще неполно. Он печатает только записи с точностью до количества строк. Она должна sparse_matrix.maxprint = sparse_matrix.count_nonzero() включать все ненулевые данные.

Ответ №2:

Здесь ‘i’ будет проходить по строкам вашей матрицы A_n, а ‘j’ будет проходить только по ненулевым столбцам для i-й строки A_n.

 file = open('sparse_matrix.txt','w')

for i in range(A_n.shape[0]):
    for j in A_n[i].nonzero()[1]:
        file.write(str(i) ' '  str(j) ' ' str(A_n[i,j]) 'n')
file.close()