2016-08-08 3 views
1

У меня есть текстовый файл с каждой линией, указывающей край на графике, напримерсоздание разреженной матрицы неизвестного размера

2 5 1 

указует на край веса 1 между узлами 2 и 5. Я хочу, чтобы создать с использованием этих кортежей. Как правило, я инициализировал разреженную матрицу как

G = scipy.sparse.lil_matrix((n,n)) 

где n - количество узлов на графике. Но в этом случае я не знаю, что такое «n». Есть ли более эффективный способ создания матрицы, чем цикл по строкам файла, чтобы найти индекс максимального узла, создав lil_matrix, а затем снова перейдя по файлу? Моя текущая реализация такова:

n = 0 
with open(gfile) as f: 
    for line in f: 
     temp = map(int,line.split()) 
     n = np.max([n,temp[0],temp[1]]) 
G = sp.lil_matrix((n,n)) 
with open(gfile) as f: 
    for line in f: 
     temp = map(int,line.split()) 
     G[temp[0],temp[1]] = temp[2] 

ответ

2

оригинальный, и до сих пор Прототипом, способ создания разреженной матрицы является собрать все входы в row, col, data массивах (или списках), а также использовать coo_matrix построить матрицу. Форма может быть выведена из этих входов (максимальные значения индекса) или задана в качестве параметра.

Чтобы адаптировать код

row, col, data = [],[],[] 
with open(gfile) as f: 
    for line in f: 
     temp = map(int,line.split()) 
     # G[temp[0],temp[1]] = temp[2] 
     data.append(temp[2]) 
     row.append(temp[0]) 
     col.append(temp[1]) 
G = sparse.coo_matrix((data, (row,col)) 

Список Присоединяет, по крайней мере так быстро, как гласит строка, и лучше, чем разреженных матриц вставок, даже lil (lil задание включает в себя список присоединяет, а).

Я подозреваю, что вы могли бы также сделать:

A = np.genfromtxt(gfile, dtype=int) # default white space delimiter 
# A should now be a 2d 3 column array 
G = sparse.coo_matrix((A[:,2], (A[:,0], A[:,1])) 

Это читается весь файл с genfromtxt или loadtxt и создать разреженную матрицу из результирующих столбцов.

(Когда я разреженные матрицы в MATLAB лет назад, я использовал этот вид данных, седловины, инициализации строки, хотя и с умным использованием индексации, чтобы собрать эти массивы из конечных блоков элементов без петель.)

+0

благодаря ! В вашем комментарии loadtxt: я думаю, что загружает весь txt-файл, которого я хотел избежать, поскольку некоторые из этих файлов могут быть довольно большими. – NSR

+0

Новый 'genfromtxt' принимает параметр' max_rows'. И все версии позволяют вам создавать линии через собственный фильтр. В любом случае, 'genfromtxt' не быстрее, чем чтение вашей собственной строки и анализ. Он делает то же самое. – hpaulj

Смежные вопросы