【问题标题】:How to store multiple numpy 1d arrays with different lengths and print it如何存储多个不同长度的 numpy 1d 数组并打印它
【发布时间】:2019-03-15 17:53:52
【问题描述】:

我从一个循环中得到了几个 numpy 数组 (X, ) 并想存储它们。我知道我可以将它们附加到传统的 python 列表中

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

但是,这个解决方案看起来并不优雅,无法解析为 numpy.savetxt。

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

还有其他解决办法吗?

【问题讨论】:

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

标签: python numpy multidimensional-array


【解决方案1】:

所以你有一个数组列表

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 有足够的工具。

 

【讨论】:

  • 非常明确的回复!一个后续问题 np.savetxt 如果数组太长,则数组列表的格式似乎很糟糕。使用逐行方法,如何在每行的开头添加一些字符串?
  • %s 使用对象的str() 方法,print 也使用该方法。对于产生多行和省略号的大型数组。在某种程度上,这是由printoptions 控制的,但最终它旨在提供数组的漂亮视图,而不是完整的“机器可读”文本表示。转换单个数组tolist() 可能会得到更令人满意的输出。
  • 您打算如何使用或阅读此文本文件?大多数csv 的读者都希望看到常规的专栏。
猜你喜欢
  • 2019-12-05
  • 2021-06-07
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
相关资源
最近更新 更多