Python中numpy数组的类列表字符串表示法

2 投票
3 回答
576 浏览
提问于 2025-04-18 00:01

假设我们有几个比较长的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

听起来你可以用 numpy.savetxt() 来实现这个功能;

大概可以这样写:

def dump_array(outfile, arraylike):
    outfile.write('[')
    numpy.savetxt(outfile, arraylike, newline=',', fmt="%s")
    outfile.write(']\n')

不过我觉得对应的 numpy.loadtxt() 可能无法读取这种格式。

2

既然你想要一个像Python列表那样的格式,那就直接用Python的列表格式吧?

array1_str = repr(list(long_array1))

这样做主要还是在C语言的环境中,性能应该会好很多。

如果你不想要空格,可以在之后把它们去掉:

array1_str = repr(list(long_array1)).translate(None, " ")

不过,内存使用可能会是个问题。

4

这是最快的方法:

','.join(map(str, long_array1.tolist()))

如果你想让文本看起来更紧凑,这个方法也很快:

','.join(map(lambda x: '%.7g' % x, long_array1.tolist()))

来源:我是pycollada库的维护者,我对所有可能的方法进行了性能测试。

撰写回答