如何在Python中将NumPy矩阵写入文本文件

17

假设我从某些计算中获得了一个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


2
我无法重现这个问题。如果我给 savetxt 函数一个二维数组(或 np.matrix),它会创建一个文本文件,每一行都是数组的一行。您能否提供一个完整的最小示例,使我们可以运行并复现单行文件? - Warren Weckesser
这条评论是对已删除评论的回复。我的示例在我这里按预期工作(使用numpy 1.7.1和1.8.0都可以)。你是如何查看文件“text.txt”的?我怀疑你展示的输出中3.00和4.00之间以及6.00和7.00之间缺少空格。你在问题中的样本输出也缺少了行分隔符应有的空格。(另外,你在哪个操作系统上运行这个程序?可能不重要,但知道一下也无妨。) - Warren Weckesser
@WarrenWeckesser,我仍然只得到一行。是的,在3.00和4.00之间以及6.00和7.00之间没有间隔。从4.00开始应该是第二行,从7.00开始是第三行。我正在使用Python 3.3.0,NumPy MKL 1.8.0,Windows 7。 - Nafees
这可能是Windows + Python 3的问题,但我没有设置系统来尝试它。 (在Windows 7 + Python 2.7 + numpy 1.7.1中,它按预期工作。)还有其他人可以重现这个问题吗? - Warren Weckesser
1
这看起来相关,尽管它只提到了Python 2.7:https://github.com/numpy/numpy/pull/3976(拉取请求)和https://github.com/numpy/numpy/issues/3975(错误报告)。 - Warren Weckesser
显示剩余2条评论
3个回答

8

就像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')

4

如果您只想使用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的方法,可用于导出数据到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
为了重新创建形状,您需要在保存文件时保存该形状。
尝试:
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不同,以#开头的行仍然被视为数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接