【问题标题】:How to write a numpy matrix in a text file - python如何在文本文件中编写一个 numpy 矩阵 - python
【发布时间】:2014-04-02 20:11:53
【问题描述】:

假设我从一些计算中得到一个 numpy 矩阵。这是我的 numpy 矩阵 'result1'::

    result1=
    [[   1.         0.         0.         0.00375   -0.01072   -0.      -1000.     ]
     [   2.         3.         4.         0.        -0.004    750.         0.     ]
     [   3.         3.         0.         0.         0.      -750.      1000.     ]]

现在我想将这个矩阵写入一个名为“result.txt”的文本文件中。为此,我编写了以下代码::

np.savetxt('result.txt', result1, fmt='%.2e')

但它在一行中给了我矩阵的所有元素。

    1.00e+00 0.00e+00 0.00e+00 3.75e-03 -1.07e-02 -1.14e-13 -1.00e+032.00e+00 3.00e+00 4.00e+00 0.00e+00 -4.00e-03 7.50e+02 0.00e+003.00e+00 3.00e+00 0.00e+00 0.00e+00 0.00e+00 -7.50e+02 1.00e+03

我想以正确的矩阵格式在文本文件中写入矩阵。我怎样才能做到这一点?我用了关键字newline='\n'或者newline='',但是结果是一样的。

提前谢谢...

=======

这个编辑的部分是给@Warren的

试试这个:

>>> import numpy as np
>>> mat=np.matrix([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
>>> mat
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
>>> np.savetxt('text.txt',mat,fmt='%.2f')

在我的 text.txt 文件中,我得到:

1.00 2.00 3.004.00 5.00 6.007.00 8.00 9.00

【问题讨论】:

  • 我无法重现这个。如果我给savetxt 提供一个二维数组(或np.matrix),它会为数组的每一行创建一个文件。您能否创建一个完整的最小示例,我们可以运行它来提供单行文件?
  • [此评论是对已删除评论的回复。]您的示例对我来说按预期工作(使用 numpy 1.7.1 和 1.8.0)。您如何查看文件“text.txt”?我怀疑您显示的输出中在 3.00 和 4.00 之间以及 6.00 和 7.00 之间缺少空格。您在问题中的示例输出也缺少行分隔符所在的空格。 (另外,你在什么操作系统上运行它?可能没关系,但知道它不会有坏处。)
  • @WarrenWeckesser,请检查编辑部分。
  • 这看起来很相关,虽然它只提到了 python 2.7:github.com/numpy/numpy/pull/3976(拉取请求)和github.com/numpy/numpy/issues/3975(错误报告)。

标签: python numpy matrix text-files


【解决方案1】:

如果你只想使用numpy:

import numpy as np

mat = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
with open('outfile.txt') as f:
    for line in mat:
        np.savetxt(f, line, fmt='%.2f')

然后

cat outfile.txt
1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 9.00

Pandas 有to_csv 方法:

import numpy as np
import pandas as pd

mat = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df = pd.DataFrame(data=mat.astype(float))
df.to_csv('outfile.csv', sep=' ', header=False, float_format='%.2f', index=False)

它具有相同的输出:

cat outfile.csv
1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 9.00

【讨论】:

    【解决方案2】:

    和 Francesco Nazzaro 的回答一样,但为了确保文件可以成功打开有点不同,试试:

    a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    mat = np.matrix(a)
    with open('outfile.txt','wb') as f:
        for line in mat:
            np.savetxt(f, line, fmt='%.2f')
    

    【讨论】:

      【解决方案3】:

      要重新创建形状,您需要在保存文件时保存形状。

      试试:

      import numpy as np
      import re
      
      result=np.array([[1.,0.,0.,0.00375,-0.01072,-0.,-1000.,],
                       [2.,3.,4.,0.,-0.004,750.,0.],
                       [3.,3.,0.,0.,0.,-750.,1000.]])
      
      with open('/tmp/test', 'w') as fout:
          fout.write(u'#'+'\t'.join(str(e) for e in result.shape)+'\n')
          result.tofile(fout)
      
      with open('/tmp/test', 'rb') as f:
          line=f.readline().decode('ascii')
          if line.startswith('#'):
              shape=tuple(map(int, re.findall(r'(\d+)', line)))
          else:
              raise IOError('Failed to find shape in file')    
      
          result2=np.fromfile(f)
          result3=result2.reshape(shape)
      
      print(np.array_equal(result, result2))
      # False
      print(np.array_equal(result, result3))
      # True
      

      您可以将形状以某种形式保存在文件中,以便重新创建相同的形状。但请确保不要忘记文件开头的数据,因为与np.loadtxt 不同,以# 开头的行仍被视为数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 2014-01-13
        • 2011-01-10
        相关资源
        最近更新 更多