【问题标题】:Python: how do you store a sparse matrix using python?Python:如何使用 python 存储稀疏矩阵?
【发布时间】:2023-03-16 12:33:01
【问题描述】:

我在 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

【问题讨论】:

  • 您有一个特定的数据库吗?这些矩阵的大小是多少?您是否考虑过 sqlite(Python 已内置支持)?
  • 我是新手,我知道的不多,我只是想找到一个解决方案来将我的矩阵存储在硬盘中我不想运行程序来生成矩阵一次又一次,如果我可以存储矩阵,我下次可以参考矩阵的值..请建议我..谢谢:)
  • 请参阅以下内容以格式化您的代码,使其易于阅读:stackoverflow.com/editing-help,但基本上只需在每行代码前放置 4 个空格,然后缩进,否则请确保留空行在代码和任何普通文本之间。

标签: python numpy sparse-matrix


【解决方案1】:

pyTables 是 HDF5 数据模型的 Python 接口,是 NumPy 和 SciPy 非常受欢迎的选择,并且与 NumPy 和 SciPy 集成得很好。 pyTables 将允许您访问数据库数组的切片,而无需将整个数组加载回内存。

我对稀疏矩阵本身没有任何具体经验,快速的 Google 搜索既没有确认也没有否认支持稀疏矩阵。

【讨论】:

    【解决方案2】:

    假设您有一个numpy matrixndarray,您的问题和标签意味着,有一个dump method和load功能您可以使用:

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

    【讨论】:

    • 所以我可以在其他程序中需要使用此outding.mat吗?? span>
    • 是的。它只是您想要存储数据的硬盘上的任何文件的路径。 span>
    【解决方案3】:

    除了对 HDF5 的支持,Python 还具有NetCDF support,它非常适合矩阵形式的数据存储以及稀疏和密集的快速访问。它包含在 Windows 的 Python-x,y 中,许多 Python 科学用户最终都使用它。

    更多基于 numpy 的示例可以在 cookbook 中找到。

    【讨论】:

      【解决方案4】:

      对于集群上非常大的稀疏矩阵,您可以使用 pytrilinos,它有一个 HDF5 接口,可以将稀疏矩阵转储到磁盘,并且如果矩阵分布在不同的节点上也可以工作。

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

      【讨论】:

        【解决方案5】:

        根据稀疏矩阵的大小,我倾向于只使用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()
        

        【讨论】:

        • 非常感谢 :) :) 如果您能解释如何访问该 spmatrix.pkl 将会有很大帮助.. 再次感谢 :)
        • 这是文件的实际输入 (0, 148) 1.0 (1, 48) 1.0 (1, 173) 1.0 (2, 173) 1.0 (3, 168) 1.0 (4, 61 ) 1.0 (4, 91) 1.0 (5, 136) 1.0 (6, 237) 2.0 (7, 111) 1.0 但从 .pkl 文件中读取数据后,我得到 (0, 148) 1.0 (0, 48) 1.0 (0, 173) 1.0 (0, 173) 1.0 (0, 168) 1.0 (0, 61) 1.0 (0, 91) 1.0 (0, 136) 1.0 (0, 237) 2.0 (0, 111) 1.0 什么是我按照你的指示做的错误:(
        • 我不明白你的意见是什么。它是您读入python的文件中的文本吗?请提供您用于生成泡菜的确切代码。最好编辑原始问题,以便正确格式化代码。
        • 请使用正确的stackoverflow格式将代码放入您的原始问题中,以便我可以真正阅读您写的内容
        • 我想将此矩阵“mat”写入文件并使用矩阵的索引我应该能够使用另一个程序访问值!...
        【解决方案6】:

        注意:这个答案是对现在提供代码的修改问题的回应。

        你不应该在你的函数中调用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()
        

        【讨论】:

        • 这段代码运行没有错误,事实上它将矩阵输出到文件中留下了一部分!..我无法使用这个命令来......mat.dump('output.mat')mat是我的矩阵.. 这是我发现的错误raise AttributeError, attr + " not found" AttributeError: dump not found
        • 您现在似乎正在使用其他方法,因为 mat.dump() 没有出现在您的代码或我的建议中。我很抱歉,但我没有时间进一步帮助您。祝你好运。
        【解决方案7】:

        对我来说,在cPickle.dump 函数中使用-1 选项会导致之后无法加载腌制文件。

        我通过cPickle 转储的对象是scipy.sparse.dok_matrix 的一个实例。

        只使用两个参数对我有用; documentation 关于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
        >>> 
        

        【讨论】:

          猜你喜欢
          • 2015-09-01
          • 2023-04-10
          • 2013-02-06
          • 2016-10-03
          • 1970-01-01
          • 2022-08-18
          • 2015-04-26
          • 1970-01-01
          • 2017-12-16
          相关资源
          最近更新 更多