numpy savetxt:将矩阵保存为行

时间:2014-03-04 13:36:15

标签: python python-3.x numpy matrix

我正在使用numpy savetxt()将矩阵的元素保存为单行文件(我需要按顺序打印大量文件)。这是我发现的方法:

import numpy as np

mat = np.array([[1,2,3],
                [4,5,6],
                [7,8,9]])

with open('myfile.dat','a') as handle:
    np.savetxt(handle, mat.reshape(1,mat.size), fmt='%+.8e')
handle.close()

有两个问题:

1)savetxt()是最佳选择吗?我需要打印1e5到1e7这些东西......我不希望i / o瓶颈实际计算。我猜测重新打开文件,每次迭代都是一个糟糕的计划,速度方面。

2)理想情况下,我会打印一些上下文数据以开始每一行,因此我的输出可能如下所示:

(N foo mat):

...
6 -2.309 +1.000 +2.000 ...
7 -4.273 +1.000 +2.000 ...
8 -3.664 +1.000 +2.000 ...
...

我可以使用np.append()执行此操作,但第一个数字不会作为INT打印。这种事情是否可以直接在savetxt()中完成?或者我还需要类似C的fprintf()吗?

2 个答案:

答案 0 :(得分:0)

Pandas有一个很好的to_csv方法:

import pandas as pd
import numpy as np

mat = np.array([[1,2,3],
                [4,5,6],
                [7,8,9]])
df = pd.DataFrame(data=mat.astype(np.float))
df.to_csv('myfile.dat', sep=' ', float_format='%+.8e', header=False)

默认情况下,它会添加索引(index=True),但如果您需要不同的上下文数据,则可以将其添加到数据框并设置index=False

$ cat myfile.dat 
0 +1.00000000e+00 +2.00000000e+00 +3.00000000e+00
1 +4.00000000e+00 +5.00000000e+00 +6.00000000e+00
2 +7.00000000e+00 +8.00000000e+00 +9.00000000e+00

答案 1 :(得分:0)

行。我作为数组打印的原始代码仅在您要打印一次时才有效。 mat.reshape()方法不仅返回重新形成的矩阵,而且还会改变m mat本身。这意味着下一次循环任何linalg例程都将失败。

为避免这种情况,我们需要重新塑造copy() mat。为清晰起见,我还添加了tmp变量。

import numpy as np

mat = np.array([[1,2,3],
                [4,5,6],
                [7,8,9]]) # initialize mat to see format

handle = open('myfile.dat', 'ab')
for n in range(N):
    # perform linalg calculations on mat ...
    meta = foo # based on current mat

    tmp = np.hstack( ([[n]], [[meta]], (mat.copy()).reshape(1,mat.size)) )
    np.savetxt(handle, tmp, fmt='%+.8e')

handle.close()

在这种情况下,这会获取上下文数据nmeta。我可以将n保存为float

我做了一些基准测试来检查i / o成本。我为循环设置N = 100,000,并将运行时间平均为6次:

  • 没有i / o,只是计算:9.1秒
  • 如上编码:17.2秒
  • 打开'myfile.dat'以追加每次迭代:30.6秒

因此,i / o使运行时间翻倍,正如预期的那样,不断打开和关闭文件是一个糟糕的计划。