考虑一些相当长的numpy数组:
importy numpy as np;
long_array1 = np.array([random.random() for i in range(10000)]);
long_array2 = np.array([random.random() for i in range(10000)]);
long_array3 = np.array([random.random() for i in range(10000)]);
我想将数组保存到文件file.dat
中,每个numpy数组一行。
数组的文本表示应该是类似python数组的格式,即在跟随numpy数组的情况下:
a = np.array([0.3213,0.145323,0.852,0.723,0.421452])
我想在文件中保存以下行。
[0.3213,0.145323,0.852,0.723,0.421452]
我做的是:
array1_str = ",".join([str(item) for item in long_array1]);
array2_str = ",".join([str(item) for item in long_array2]);
array3_str = ",".join([str(item) for item in long_array3]);
with open("file.dat","w") as file_arrays:
file_arrays.write("[" + array1_str + "]\n");
file_arrays.write("[" + array2_str + "]\n");
file_arrays.write("[" + array3_str + "]\n");
实际上一切都很好。我只是怀疑代码的效率。我几乎肯定必须有另一种(更好,更有效)的方法来做到这一点。 我也欢迎对随机列表生成的评论。
答案 0 :(得分:4)
这是最快的方式:
','.join(map(str, long_array1.tolist()))
如果你想让文字更紧凑,这也很快:
','.join(map(lambda x: '%.7g' % x, long_array1.tolist()))
资料来源:我将每个可能的方法作为pycollada库的维护者进行基准测试。
答案 1 :(得分:2)
既然你想要一个类似Python列表的格式,那么实际使用Python列表格式呢?
array1_str = repr(list(long_array1))
这将主要留在C-land,性能应该会好得多。
如果您不想要这些空格,请在以下情况之后退出:
array1_str = repr(list(long_array1)).translate(None, " ")
然而,内存使用可能是一个问题。
答案 2 :(得分:0)
听起来你可以使用numpy.savetxt()
来做这件事;
类似的东西:
def dump_array(outfile, arraylike):
outfile.write('[')
numpy.savetxt(outfile, arraylike, newline=',', fmt="%s")
outfile.write(']\n')
虽然我不认为相应的numpy.loadtxt()
能够以这种格式阅读。