Преобразование матрицы scipy.sparse в эквивалентную разреженную матрицу MATLAB - PullRequest
0 голосов
/ 03 июля 2019

У меня есть scipy.sparse.lil_matrix, который я хочу передать в метод MATLAB (который я не пишу), используя MATLAB Engine API для Python .Посты, которые я видел до сих пор, касаются либо того, как преобразовать разреженную матрицу MATLAB в эквивалент Python, либо требуют изменения кода Matlab, который я бы предпочел обойти.

1 Ответ

1 голос
/ 03 июля 2019

Внутренне я считаю, что MATLAB использует формат csc. Но конструкция (по крайней мере, когда я использовал ее много лет назад) со входами в стиле coo - данные, строки, столбцы.

Я бы предложил создать разреженную матрицу в MATLAB и сохранить ее (в режиме до HDF5) в формате .mat. Затем загрузите это с scipy.io.loadmat. Затем используйте этот результат в качестве руководства при записи матрицы scipy.sparse обратно в .mat.

scipy.sparse имеет функцию save, но использует np.savez для записи соответствующих массивов атрибутов. Если у вас был код MATLAB, который мог обрабатывать файлы .npy, вы, вероятно, могли бы загрузить такое сохранение (снова используя формат coo).

===

Тест.

Создание и сохранение разреженной матрицы:

In [263]: from scipy import io, sparse                                                                          
In [264]: M = sparse.random(10,10,.2,'coo')                                                                     
In [265]: io.savemat('sparse.mat', {'M':M})       

тестовая нагрузка на стороне Python:

In [268]: io.loadmat('sparse.mat')                                                                              
Out[268]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Wed Jul  3 11:41:23 2019',
 '__version__': '1.0',
 '__globals__': [],
 'M': <10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Column format>}

Таким образом, savemat преобразовал формат coo в csc перед сохранением.

В октавном сеансе:

>> load sparse.mat
>> M
M =

Compressed Column Sparse (rows = 10, cols = 10, nnz = 20 [20%])

  (4, 1) ->  0.41855
  (6, 1) ->  0.33456
  (7, 1) ->  0.47791
  (4, 3) ->  0.27464
  (2, 4) ->  0.96700
  (3, 4) ->  0.60283
  (10, 4) ->  0.41400
  (1, 5) ->  0.57004
  (2, 5) ->  0.44211
  (1, 6) ->  0.63884
  (3, 7) ->  0.012127
  (8, 7) ->  0.77328
  (8, 8) ->  0.25287
  (10, 8) ->  0.46280
  (1, 9) ->  0.0022617
  (6, 9) ->  0.70874
  (1, 10) ->  0.79101
  (3, 10) ->  0.81999
  (6, 10) ->  0.12515
  (9, 10) ->  0.60660

Похоже, код savemat/loadmat обрабатывает разреженные матрицы совместимым с MATLAB способом.

...