我正在使用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()
吗?
答案 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()
在这种情况下,这会获取上下文数据n
和meta
。我可以将n
保存为float
。
我做了一些基准测试来检查i / o成本。我为循环设置N = 100,000,并将运行时间平均为6次:
因此,i / o使运行时间翻倍,正如预期的那样,不断打开和关闭文件是一个糟糕的计划。