numpy数组的类似Python列表的字符串表示形式

时间:2014-03-26 17:51:22

标签: python arrays numpy

考虑一些相当长的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");

实际上一切都很好。我只是怀疑代码的效率。我几乎肯定必须有另一种(更好,更有效)的方法来做到这一点。 我也欢迎对随机列表生成的评论。

3 个答案:

答案 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()能够以这种格式阅读。