2017-04-16 84 views
0

我从循环中获得了几个numpy数组(X,)并且想要存储它们。我知道,我可以把它们添加到传统的Python列表如何存储多个不同长度的numpy 1d数组并打印它

A = [] 
for i in range(10): 
    A.append(some_numpy_array) 

但是,这个方案看起来并不优雅,不能被解析到numpy.savetxt。

numpy.savetxt("out.txt", A) 

有没有其他解决方案?

+0

你需要一个ascii文件作为输出吗? – Astrom

回答

0

所以,你有数组列表

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,给出一个列表,将它变成一个数组,像我一样,然后尝试写'行'。 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] 

这写了列表/数组作为1d数组与每行的一般字符串格式。有效

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,每次写一个数组:试图写3D阵列时

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 

人遇到同样的问题,或其他阵列,唐不适合简单的二维数字数组模型。您不必使用savetxt将文本写入文件。简单的Python有足够的工具。

+0

非常明确的回复!一个后续问题,如果数组太长,np.savetxt数组列表似乎格式严重。使用逐行方法,如何在每行的开头添加一些字符串? – Kevin

+0

'%s'使用对象的'str()'方法,也被'print'使用。对于产生多行和省略号的大型数组。在某种程度上,它是由'printoptions'控制的,但最终它的设计是为了给出一个漂亮的数组视图,而不是一个完整的'机器可读'文本表示。转换单个数组'tolist()'可能会得到更满意的输出结果。 – hpaulj

+0

你打算如何使用或阅读这个文本文件?大多数'csv'读者期望有定期的专栏。 – hpaulj

相关问题