#python #numpy #scipy #sparse-matrix #sparse-file
#python #numpy #scipy #разреженная матрица #разреженный файл
Вопрос:
Я пытаюсь вывести numpy ndarray в виде CSR-файла (это промежуточный этап, я пытаюсь использовать программу, которая требует формат CSR в качестве входных данных).
До сих пор я пытался использовать scipy.sparse.coo_matrix()
и записывать в файл ijv со следующим кодом:
pca_coo = scipy.sparse.coo_matrix(pca_result)
with open(project '/matrix/for_knn.jiv', 'w') as f:
for row, col, val in zip(pca_coo.row, pca_coo.col, pca_coo.data):
t= f.write("{}t{}t{}n".format(row, col, val))
Файл, созданный приведенным выше кодом, приводит к тому, что программа ниже по потоку переходит в segfault.
На данный момент я предполагаю, что проблема заключается в формате вывода, но я не смог найти проблему.
Редактировать: ответ приведен ниже.
Комментарии:
1. Я не знаю ни одного стандартного способа хранения матрицы csr в текстовом файле. У вас есть формат координатной матрицы, и похоже, что проблема в какой-то другой программе. Кроме того, я не знаю, как у вас есть время выполнения, которое длится так долго для чего-либо в sklearn.neighbours, не задевая стену памяти.
2. Что это за формат csr, который ожидает ваш код?
3. Я не уверен, но вы проверили, правильно ли открыт почтовый файл и доступны ли данные для чтения? Как я и искал, вы должны использовать «из zipfile импортировать ZipFile».
4. У меня много памяти, с которой нужно работать. Я также был удивлен низкой производительностью. Я отредактировал, чтобы показать решение, предложенное моим другом, которое, кажется, работает нормально. ссылка См. Ссылку для сжатого формата разреженной строки. Для справки, тот же набор данных, для запуска которого в python потребовалось 30 часов, занимает 3 минуты при более быстрой реализации (используя 48 потоков вместо одного потока python, но все же… большое улучшение).
5. Попробуйте установить n_jobs=-1, чтобы scikit распараллелился в следующий раз.
Ответ №1:
Друг помог мне со следующим:
def write_csr(C, outputname):
"""
writes out a csr matrix to a file (for use with l2knng).
C = csr matrix
outputName = output file name
"""
with open(outputname, 'a') as OUTFILE:
for i in range(0,C.shape[0]):
sub = C[i,]
outstr = ""
for j in range(0,sub.size):
outstr = " " str(sub.indices[j] 1) " " str(sub.data[j])
outstr = "n"
_ = OUTFILE.write(outstr)
Кажется, работает хорошо.