Как я могу передать разреженное представление .txt в плотную матрицу в scipy? - PullRequest
1 голос
/ 31 октября 2019

У меня есть файл .txt из набора данных epinion, который является разреженным представлением (т. Е. 23 387 5 представляет факт "пользователь 23 оценил элемент 387 как 5"). из этого разреженного формата я хочу перевести его в плотное представление, так что я могу выполнить матричную факторизацию для него.

Я загрузил файл с loadtxt() из numpy, и это массив [664824, 3]. Используя scipy.sparse.csr_matrix, я перевожу его в массив numpy и используя todense() от scipy. Я надеялся получить плотный формат, но всегда получал одну и ту же матрицу: [664824, 3]. Как я могу превратить его в исходное [40163,139738] плотное представление?

import numpy as np
from io import StringIO

d = np.loadtxt("MFCode/Epinions_dataset.txt") 
S = csr_matrix(d)
D = R.todense()

Я ожидал плотную матрицу с формой [40163,139738]

1 Ответ

0 голосов
/ 31 октября 2019

Небольшой образец csv-подобного текста:

In [218]: np.lib.format.open_memmap?                                            
In [219]: txt = """0 1 3 
     ...: 1 0 4 
     ...: 2 2 5 
     ...: 0 3 6""".splitlines()                                                 
In [220]: data = np.loadtxt(txt)                                                
In [221]: data                                                                  
Out[221]: 
array([[0., 1., 3.],
       [1., 0., 4.],
       [2., 2., 5.],
       [0., 3., 6.]])

Использование sparse с использованием стиля ввода (data, (row, col)):

In [222]: from scipy import sparse                                              
In [223]: M = sparse.coo_matrix((data[:,2], (data[:,0], data[:,1])), shape=(5,4))                                                                     
In [224]: M                                                                     
Out[224]: 
<5x4 sparse matrix of type '<class 'numpy.float64'>'
    with 4 stored elements in COOrdinate format>
In [225]: M.A                                                                   
Out[225]: 
array([[0., 3., 0., 6.],
       [4., 0., 0., 0.],
       [0., 0., 5., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

Альтернативное заполнениев массиве zeros напрямую:

In [226]: arr = np.zeros((5,4))                                                 
In [227]: arr[data[:,0].astype(int), data[:,1].astype(int)]=data[:,2]           
In [228]: arr                                                                   
Out[228]: 
array([[0., 3., 0., 6.],
       [4., 0., 0., 0.],
       [0., 0., 5., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

Но учтите, что np.zeros([40163,139738]) может вызвать ошибку памяти. M.A (M.toarray()) `также может сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...