Python: как вы храните разреженную матрицу с помощью python?

У меня есть выход с использованием разреженной матрицы в python, мне нужно сохранить эту разреженную матрицу на моем жестком диске, как я могу это сделать? если я должен создать базу данных, то как мне это сделать? это мой код:

import nltk import cPickle import numpy from scipy.sparse import lil_matrix from nltk.corpus import wordnet as wn from nltk.corpus import brown f = open('spmatrix.pkl','wb') def markov(L): count=0 c=len(text1) for i in range(0,c-2): h=L.index(text1[i]) k=L.index(text1[i+1]) mat[h,k]=mat[h,k]+1//matrix cPickle.dump(mat,f,-1) text = [w for g in brown.categories() for w in brown.words(categories=g)] text1=text[1:500] arr=set(text1) arr=list(arr) mat=lil_matrix((len(arr),len(arr))) markov(arr) f.close() 

Мне нужно сохранить этот «мат» в файле и получить доступ к значению матрицы с помощью координат.

результат разреженной матрицы таков: «результат разреженной матрицы выглядит так:

 (173, 168) 2.0 (173, 169) 1.0 (173, 172) 1.0 (173, 237) 4.0 (174, 231) 1.0 (175, 141) 1.0 (176, 195) 1.0 

но когда я храню его в файле и читаю то же самое, я получаю его вот так:

 (0, 68) 1.0 (0, 77) 1.0 (0, 95) 1.0 (0, 100) 1.0 (0, 103) 1.0 (0, 110) 1.0 (0, 112) 2.0 (0, 132) 1.0 (0, 133) 2.0 (0, 139) 1.0 (0, 146) 2.0 (0, 156) 1.0 (0, 157) 1.0 (0, 185) 1.0 

  • вывод на печать питона на другом модуле
  • PYTHONPATH не работает для sudo на GNU / Linux (работает для root)
  • Hashable, неизменный
  • Неструктурированный текст для структурированных данных
  • Правильно ли использовать «import __main__»?
  • В py.test, что такое использование файлов conftest.py?
  • Python читает из аргументов командной строки или stdin
  • Различные результаты интеграции с использованием метода Монте-Карло против scipy.integrate.nquad
  • 7 Solutions collect form web for “Python: как вы храните разреженную матрицу с помощью python?”

    Примечание . Этот ответ отвечает на вопрос о пересмотре, который теперь предоставляет код.

    Вы не должны вызывать cPickle.dump() в своей функции. Создайте разреженную матрицу, а затем выгрузите ее содержимое в файл.

    Пытаться:

     def markov(L): count=0 c=len(text1) for i in range(0,c-2): h=L.index(text1[i]) k=L.index(text1[i+1]) mat[h,k]=mat[h,k]+1 #matrix text = [w for g in brown.categories() for w in brown.words(categories=g)] text1=text[1:500] arr=set(text1) arr=list(arr) mat=lil_matrix((len(arr),len(arr))) markov(arr) f = open('spmatrix.pkl','wb') cPickle.dump(mat,f,-1) f.close() 

    Предполагая, что у вас есть matrix numpy или ndarray , что подразумевает ваш вопрос и теги, существует метод dump и функция load вы можете использовать:

     your_matrix.dump('output.mat') another_matrix = numpy.load('output.mat') 

    pyTables – это интерфейс Python для модели данных HDF5 и является довольно популярным выбором и хорошо интегрирован с NumPy и SciPy. pyTables позволит вам получить доступ к срезам массивов данных, не загружая весь массив обратно в память.

    У меня нет никакого конкретного опыта с разреженными матрицами как таковыми, и быстрый поиск Google не подтвердил и не отрицал, что разреженные матрицы поддерживаются.

    Добавляя поддержку HDF5, Python также поддерживает NetCDF, который идеально подходит для хранения данных в виде матрицы и быстрого доступа, как редких, так и плотных. Он включен в Python-x, y для окон, с которыми сталкиваются многие научные пользователи python.

    В этой кулинарной книге можно найти более числовые примеры.

    Для очень больших разреженных матриц на кластерах вы можете использовать pytrilinos, у него есть интерфейс HDF5, который может сбрасывать разреженную матрицу на диск и работает также, если матрица распределена на разных узлах.

    http://trilinos.sandia.gov/packages/pytrilinos/development/EpetraExt.html#input-output-classes

    В зависимости от размера разреженной матрицы я обычно использую cPickle для cPickle массива:

     import cPickle f = open('spmatrix.pkl','wb') cPickle.dump(your_matrix,f,-1) f.close() 

    Если я имею дело с действительно большими наборами данных, то я склонен использовать netcdf4-python

    Редактировать:

    Чтобы снова открыть файл, вы должны:

     f = open('spmatrix.pkl','rb') # open the file in read binary mode # load the data in the .pkl file into a new variable spmat spmat = cPickle.load(f) f.close() 

    Для меня использование опции -1 в функции cPickle.dump заставило маринованный файл не загружаться впоследствии.

    Объект, который я сбросил с помощью cPickle был экземпляром scipy.sparse.dok_matrix .

    Использование только двух аргументов сделало трюк для меня; документация о pickle.dump() указывает, что значение по умолчанию для параметра protocol равно 0 .

    Работает на Windows 7, Python 2.7.2 (64 бит) и cPickle v 1.71.

    Пример:

     >>> import cPickle >>> print cPickle.__version__ 1.71 >>> from scipy import sparse >>> H = sparse.dok_matrix((135, 654), dtype='int32') >>> H[33, 44] = 8 >>> H[123, 321] = -99 >>> print str(H) (123, 321) -99 (33, 44) 8 >>> fname = 'dok_matrix.pkl' >>> f = open(fname, mode="wb") >>> cPickle.dump(H, f) >>> f.close() >>> f = open(fname, mode="rb") >>> M = cPickle.load(f) >>> f.close() >>> print str(M) (123, 321) -99 (33, 44) 8 >>> M == H True >>> 
    Python - лучший язык программирования в мире.