Конвертировать созданные вручную DOK в CSR - PullRequest
0 голосов
/ 27 мая 2019

Для задачи машинного обучения мне нужна разреженная матрица в формате CSR.В качестве первого шага я вручную создаю DOK, который выглядит примерно так (на основе this guid):

dok = { (0,0): 1, (0,9): 1, (5,12): 1}
#the value is always 1
#the keys representing the position in the matrix
#my DOK has around 6 million entries like these

Я знаю, что хочу отформатировать это в CSR.Если я правильно понимаю docs , это возможно только в том случае, если мой ввод также является разреженной матрицей.Но мой DOK не распознается как разреженная матрица, просто как словарь.Я также не смог преобразовать свой DOK в «настоящий» DOK (произошла следующая ошибка):

TypeError: Expected rank <=2 dense array or matrix.

Так как мне преобразовать мой DOK в CSR?

1 Ответ

0 голосов
/ 27 мая 2019
In [472]: dok = { (0,0): 1, (0,9): 1, (5,12): 1}  

Сделать пустую dok матрицу:

In [473]: M = sparse.dok_matrix((20,20), dtype=int)                                                   
In [474]: M                                                                                           
Out[474]: 
<20x20 sparse matrix of type '<class 'numpy.int64'>'
    with 0 stored elements in Dictionary Of Keys format>

M является подклассом словаря Python.Раньше мы могли использовать метод словаря .update, чтобы эффективно добавлять новые значения из словаря Python, но этот метод был отключен (попробуйте увидеть сообщение об ошибке).Однако задняя дверь была предоставлена:

In [475]: M._update(dok)                                                                              
In [476]: M                                                                                           
Out[476]: 
<20x20 sparse matrix of type '<class 'numpy.int64'>'
    with 3 stored elements in Dictionary Of Keys format>

_update содержит предупредительный комментарий, что значения не проверяются, поэтому используйте с осторожностью.

После того, как вы получите формат dok, выможно преобразовать его в csr формат:

In [477]: M1=M.tocsr()                                                                                
In [478]: M1                                                                                          
Out[478]: 
<20x20 sparse matrix of type '<class 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>
In [479]: M1.A                                                                                        
Out[479]: 
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       ...
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
      dtype=int64)

Если вы допустили ошибку при определении dok, он, вероятно, будет отображаться при преобразовании csr.

Другой вариантсостоит в том, чтобы перебрать ваш dok и создать соответствующие входные данные стиля coo (данные, строки, столбцы).Это был оригинальный стиль, который стоит понять и использовать.

...