2011-03-02 39 views
8

tengo una salida usando matrices dispersas en Python, i necesidad de almacenar esta matriz dispersa en mi disco duro, ¿cómo puedo hacerlo? si debería crear una base de datos, ¿cómo debería hacerlo? este es mi código:Python: ¿cómo se almacena una matriz dispersa usando 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() 

necesito para almacenar este "mat" en un archivo y debe acceder al valor de la matriz utilizando las coordenadas ..

resultado de la matriz dispersa es como esto: `el resultado de matriz dispersa son así:

(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 

pero cuando la almacena en un archivo y lee el mismo lo estoy consiguiendo de esta manera:

(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 
+3

¿Tiene una base de datos en particular en mente? ¿Cuál es el tamaño de estas matrices? ¿Has considerado sqlite (que Python tiene soporte integrado)? – NullUserException

+0

soy novato, no sé mucho, bueno solo estoy tratando de encontrar una solución para almacenar mi matriz en el disco duro no quiero ejecutar el programa para producir la matriz una y otra vez, si puedo almacenar la matriz, solo puedo hacer referencia a la matriz de los valores la próxima vez .. los pls me sugieren ... gracias :) –

+1

Por favor, consulte lo siguiente para formatear su código para que sea legible: http://stackoverflow.com/editing-help, pero básicamente solo coloque 4 espacios antes de cada línea de código y luego sangría como lo haría de otra manera, asegurándose de dejar una línea en blanco entre el código y cualquier texto normal. – JoshAdel

Respuesta

4

Nota: Esta respuesta es una respuesta a la pregunta que revisar ahora proporciona código.

No debe llamar cPickle.dump() en su función. Cree la matriz dispersa y luego vacíe su contenido en el archivo.

Probar:

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() 
+1

Este código se ejecuta sin errores, de hecho, ¡emite la matriz al archivo dejando una parte! ... no puedo usar este comando para ... 'mat.dump ('output.mat')' donde 'mat' es mi matriz .. Este es el error que estoy encontrando' raise AttributeError, attr + "not found" AttributeError: dump not found' –

+3

Parece que utilice otro método ahora ya que mat.dump() no aparece en su código o en mi sugerencia. Me disculpo, pero no tengo tiempo para ayudarlo más. La mejor de las suertes. – JoshAdel

2

pyTables es la interfaz de Python para HDF5 modelo de datos y es muy popular para la elección y bien integrado con NumPy y SciPy. pyTables te permitirá acceder a segmentos de matrices basadas en datos sin necesidad de cargar toda la matriz nuevamente en la memoria.

que no tienen ninguna experiencia específica con escasa matrices per se y una rápida búsqueda de Google no confirmó ni negó que las matrices dispersas son compatibles.

6

Asumiendo que tiene un numpy matrix o ndarray, que su pregunta y etiquetas implican, hay una dump método y load función que puede utilizar:

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

entonces, ¿puedo usar este output.mat en cualquier momento que necesite en otros programas? –

+0

Sí. Es solo el camino a cualquier archivo en su disco duro donde le gustaría almacenar los datos. – ide

2

Añadiendo el apoyo HDF5, Python también tiene NetCDF support cuales es ideal para el almacenamiento de datos en forma de matriz y el acceso rápido, tanto escaso como denso. Se incluye en Python-x,y para Windows, que muchos usuarios científicos de Python acaban teniendo.

Más ejemplos basados ​​numpy se pueden encontrar en este cookbook.

2

Dependiendo del tamaño de la matriz dispersa, tiendo a utilizar cPickle de estibar la matriz:

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

Si estoy tratando con muy grandes conjuntos de datos a continuación, que tienden a utilizar netcdf4-python

Editar:

A continuación, acceder al archivo de nuevo lo haría:

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() 
+0

Muchas gracias :) :) si pudiera explicar cómo acceder a ese spmatrix.pkl será de gran ayuda ... gracias de nuevo :) –

+0

muchas gracias por su ayuda :) –

+0

esta es la entrada real al archivo (0, 148) \t 1,0 (1, 48) \t 1,0 (1, 173) \t 1,0 (2, 173) \t 1,0 (3, 168) \t 1,0 (4, 61) \t 1,0 (4, 91) \t 1,0 (5, 136) \t 1,0 (6, 237) \t 2,0 (7, 111) \t 1,0 b ut después de leer los datos desde el archivo .pkl estoy recibiendo (0, 148) \t 1,0 (0, 48) \t 1,0 (0, 173) \t 1,0 (0, 173) \t 1,0 (0, 168) \t 1,0 (0, 61) \t 1,0 (0, 91) \t 1,0 (0, 136) \t 1,0 (0, 237) \t 2,0 (0, 111) \t 1,0 lo que es el error que han hecho como lo has instruido :( –

2

Para mí, usando la opción -1 en función cPickle.dump causó el archivo en escabeche a no ser que puede cargarse después.

El objeto que descargué a través de cPickle era una instancia de scipy.sparse.dok_matrix.

Usar solo dos argumentos me funcionó; documentation acerca de pickle.dump() indica que el valor predeterminado del parámetro es 0.

Trabajando en Windows 7, Python 2.7.2 (64 bits) y cPickle v 1.71.

Ejemplo:

>>> 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 
>>> 
Cuestiones relacionadas