Я пытаюсь загрузить файл этого CSV в разреженную матрицу Numpy, которая будет представлять biadjacency матрицу этого пользователь-subreddit двудольного графа: http://figshare.com/articles/reddit_user_posting_behavior/874101эффективно строить разреженную матрицу biadjacency в Numpy
Вот пример:
603,politics,trees,pics
604,Metal,AskReddit,tattoos,redditguild,WTF,cocktails,pics,funny,gaming,Fitness,mcservers,TeraOnline,GetMotivated,itookapicture,Paleo,trackers,Minecraft,gainit
605,politics,IAmA,AdviceAnimals,movies,smallbusiness,Republican,todayilearned,AskReddit,WTF,IWantOut,pics,funny,DIY,Frugal,relationships,atheism,Jeep,Music,grandrapids,reddit.com,videos,yoga,GetMotivated,bestof,ShitRedditSays,gifs,technology,aww
Есть 876,961 линии (по одному на каждый пользователь) и 15,122 subreddits и в общей сложности 8,495,597 пользователя-subreddit ассоциаций.
Вот код, который я прямо сейчас, и который занимает 20 минут, чтобы работать на моем MacBook Pro:
import numpy as np
from scipy.sparse import csr_matrix
row_list = []
entry_count = 0
all_reddits = set()
with open("reddit_user_posting_behavior.csv", 'r') as f:
for x in f:
pieces = x.rstrip().split(",")
user = pieces[0]
reddits = pieces[1:]
entry_count += len(reddits)
for r in reddits: all_reddits.add(r)
row_list.append(np.array(reddits))
reddits_list = np.array(list(all_reddits))
# 5s to get this far
rows = np.zeros((entry_count,))
cols = np.zeros((entry_count,))
data = np.ones((entry_count,))
i=0
user_idx = 0
for row in row_list:
for reddit_idx in np.nonzero(np.in1d(reddits_list,row))[0]:
cols[i] = user_idx
rows[i] = reddit_idx
i+=1
user_idx+=1
adj = csr_matrix((data,(rows,cols)), shape=(len(reddits_list), len(row_list)))
Кажется, трудно поверить, что это так быстро, как это может пойти ... Загрузка 82MB-файл в список списков занимает 5 секунд, но построение разреженной матрицы занимает в 200 раз больше. Что я могу сделать, чтобы ускорить это? Есть ли какой-то формат файла, который я могу преобразовать в этот CSV менее чем за 20 минут, которые будут импортироваться быстрее? Есть ли какая-то явно дорогая операция, которую я здесь делаю, это не хорошо? Я попытался создать плотную матрицу, и я попытался создать lil_matrix
и dok_matrix
и назначить 1
по одному, и это не быстрее.
Что время фот двойной цикл ? Запрос csr? Сначала я попытался бы векторизовать внутренний цикл for, т. Е. Сразу назначить несколько значений. – hpaulj