【问题标题】:Python: storing a large matrix into a text file for later usagePython:将大矩阵存储到文本文件中以供以后使用
【发布时间】:2014-04-30 11:19:47
【问题描述】:

根据您的经验,将二维数组存储到文本文件中的最佳方式是什么?我的矩阵非常大,但让我们以一个小的 3 x 3 矩阵为例。可以像这样(到 .txt 文件)存储它:

3 7 5
2 9 8
8 0 1

在同一行的元素之间使用空格,并用换行符将行本身彼此分开。然后,如果您想将此保存的矩阵与不同的 python 文件一起使用,您只需进行相应的解析即可。

但是,是否有更好的方式(例如,需要几行代码的方式)来存储和检索大型矩阵?

[编辑]:是的,现在我有一个列表列表(或者,一个数组数组),但我愿意使用 numpy 的想法,如果这会让事情变得更容易

【问题讨论】:

  • 你说“二维数组”和“矩阵”;你在使用numpy,还是真的有一个列表列表?
  • 用四个空格缩进数字以格式化为代码。这就像选择相关文本并单击编辑器中的{} 按钮一样简单。
  • @DSM 我编辑了问题,以回答您的问题
  • @MarceloCantos 感谢您的建议
  • 注意:listarray 在 Python 中不是同义词。 list 是内置类型;还有一个array.array 类型,也是内置的;还有numpy.ndarray,通常也称为array

标签: python arrays matrix multidimensional-array


【解决方案1】:

如果它是一个简单的数组数组,一种选择是将其存储为带有json.dump(open('file.dat', 'w')) 的json 并使用json.load(open('file.dat')) 加载它。这有其优点和缺点。 (可读,但不是最有效的。)

如果使用 numpy 是一个选项,你应该使用它。它在保存、表示和序列化大型数组方面效率更高。

【讨论】:

    【解决方案2】:

    您可以使用csv module

    import csv
    
    l = [[3,7,5],
         [2,9,8],
         [8,0,1]]
    
    with open('matrix.txt', 'wb') as csvfile:
        matrixwriter = csv.writer(csvfile, delimiter=' ')
        for row in l:
            matrixwriter.writerow(row)
    
    
    l2 = []
    with open('matrix.txt', 'rb') as csvfile:
        matrixreader = csv.reader(csvfile, delimiter=' ')
        for row in matrixreader:
            l2.append(row)
    
    print(l2)
    

    【讨论】:

    • 你会说这比使用 numpy 方法更好吗?
    • csv 模块是 Python 标准库的一部分,而 numpy 不是。这对您是否重要取决于您将在何处使用它。
    【解决方案3】:

    如果您使用的是numpy,那么several routines listed under the io category 应该会有所帮助。其中之一的示例如下:

    >>> """ Assuming your matrix is called x """
    >>> from tempfile import TemporaryFile
    >>> outfile = TemporaryFile()
    >>> np.save(outfile, x)
    

    要重新加载这个,你需要加载函数:

    >>> x2 = np.load(outfile)
    

    你的数组应该被复制到 x2 中。

    二维python数组中creating a numpy array的示例如下:

    x = np.array([2, 3, 1, 0])
    

    如果您需要进一步的帮助,请发表评论。

    【讨论】:

    • 所以我猜你会将'x'初始化为一个numpy矩阵,或者你会通过创建一个数组数组来做这件事吗?
    • 请查看我的答案的编辑以帮助创建正确的结构...
    【解决方案4】:

    我个人会使用 joblib 来存储数组的二进制表示。它还允许使用 compress 参数来减小大小。

    from joblib import dump
    dump(arr, filename, compress=3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多