Вывод numpy.ndarray как csr-файл

#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)
 

Кажется, работает хорошо.