所以你有一个数组列表
In [6]: alist = [np.arange(i) for i in range(3,7)]
In [7]: alist
Out[7]:
[array([0, 1, 2]),
array([0, 1, 2, 3]),
array([0, 1, 2, 3, 4]),
array([0, 1, 2, 3, 4, 5])]
这有什么不雅之处?你可以把它包装在一个对象数组中
In [8]: arr=np.array(alist)
In [9]: arr
Out[9]:
array([array([0, 1, 2]), array([0, 1, 2, 3]), array([0, 1, 2, 3, 4]),
array([0, 1, 2, 3, 4, 5])], dtype=object)
这失去了像append 这样的列表方法,但获得了像reshape 这样的数组方法。数组数学必须求助于 python 级别的迭代,速度相当于列表推导。还有一个大问题 - 所有子列表的长度都相同,结果是一个 2d int 数组,而不是一个对象。
savetxt,给定一个列表,会像我一样把它变成一个数组,然后尝试写'rows'。 savetxt 旨在生成 CSV 输出 - 带有分隔符的整齐的行和列。这个列表的显示没有意义,是吗?
In [11]: np.savetxt('test.txt',alist,fmt='%s',delimiter=',')
In [12]: cat test.txt
[0 1 2]
[0 1 2 3]
[0 1 2 3 4]
[0 1 2 3 4 5]
这将列表/数组写为一维数组,每行都有一般的字符串格式。有效
In [13]: for row in alist:
...: print(row)
...:
[0 1 2]
[0 1 2 3]
[0 1 2 3 4]
[0 1 2 3 4 5]
您可以在打开的文件上重复savetxt,一次写入一个数组:
In [18]: with open('test.txt','wb') as f:
...: for row in alist:
...: np.savetxt(f, [row], fmt='%5d',delimiter=',')
In [19]: cat test.txt
0, 1, 2
0, 1, 2, 3
0, 1, 2, 3, 4
0, 1, 2, 3, 4, 5
人们在尝试编写 3d 数组或其他不适合简单 2d 数值数组模型的数组时会遇到同样的问题。您不必使用savetxt 将文本写入文件。普通 Python 有足够的工具。