【问题标题】:np.savetxt does not appear to work for n-d arraysnp.savetxt 似乎不适用于 n-d 数组
【发布时间】:2016-09-07 01:01:04
【问题描述】:

我正在尝试使用 numpy.savetxt 保存一个 4-D 数组,但它似乎不起作用。

In [13]: mat = np.zeros((3,3,2,2))
In [14]: mat[0][0][0][0] = 1.5e+10
In [15]: mat[0][0][0][1] = 1.6e+10
In [16]: mat[0][0][1][0] = 1.7e+10
In [17]: mat[0][0][1][1] = 1.8e+10
In [18]: np.savetxt("/tmp/save_mat", mat)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
----> 1 np.savetxt("/tmp/save_mat", mat)

python2.7/site-packages/numpy/lib/npyio.pyc in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments)
 1158                     print(e)
 1159                     raise TypeError("Mismatch between array dtype ('%s') and "
-> 1160                                     "format specifier ('%s')"
 1161                                     % (str(X.dtype), format))
 1162         if len(footer) > 0:

 TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e %.18e %.18e')

我编辑了 npyio.py 并打印出实际的 TypeError 而不是重新引发的 TypeError,它是

float argument required, not numpy.ndarray

如果我使用二进制保存方法效果很好

In [20]: fd = open("/tmp/save_mat", "w")
In [21]: np.save(fd, mat)
In [22]: fd.close()

并且创建了一个非零文件

$ ls -al /tmp/save_mat
-rw-r--r--  1  368 May 11 07:17 /tmp/save_mat

numpy 文档没有说明数组维度,只是说它是“类数组”。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html

numpy.savetxt(fname, X, fmt='%.18e', delimiter='', newline='\n', header='', footer='', cmets='#')[源代码]

将数组保存到文本文件。 参数:

fname : 文件名或文件句柄 如果文件名以 .gz 结尾,则文件会自动以压缩的 gzip 格式保存。 loadtxt 可以透明地理解 gzip 文件。

X : array_like 要保存到文本文件的数据。

还有人看到这个吗?这是预期的行为吗?

【问题讨论】:

  • 嗯,你在寻找什么格式的输出?如何在二维文本文件中表示 4 维数组并不是很明显。
  • savetxt 创建一个csv 样式文件,可以用loadtxt 加载。它遍历rows,并将每个写入一个字符串格式的行。
  • 我只是在寻找可以保存并稍后重新加载的内容。所以二进制 save 现在对我有用,但我很好奇,因为 savetxt 的实现似乎与文档一致。
  • 将数字数据保存在文本文件中只有在需要人类阅读时才有意义。与二进制格式相比,文本文件的读写速度较慢,并且对存储空间的利用效率较低。
  • 它还有一个优点是它更便携,无论是现在被其他程序/语言读取,还是能够从现在开始读取文件 ~ 5 年后,即使二进制文件 @987654332 @ 格式已更改。顺便说一句,我真的不确定为什么这会变成文本与二进制参数。将数据保存为文本是一个合法的用例。如果 savetxt 不支持 n-d 数组,我认为期望它应该被记录为这样是不合理的 - 即 Save an array to a text file -> Save a 1-D or 2-D array to a text file

标签: python arrays numpy


【解决方案1】:

再次查看您更改错误消息的位置:

for row in X:
   try:
       fh.write(asbytes(format % tuple(row) + newline))
   except TypeError:
   ...

用你的mat试试这个:

print('%.18e %.18e %.18e'%tuple(np.array([1,2,3]))) # working
for row in mat:
    print('%.18e %.18e %.18e'%tuple(row))   # your error

这是直接的 Python 字符串格式化操作。它仅在行中的元素数量(转换为元组之后)与格式中的% 说明符的数量匹配时才有效。并且元素必须匹配 - 在这种情况下,可以使用 %e 显示的数字。

savetxt 中没有规定迭代数组的更高维度。您必须自己进行这种迭代。

大致:

f = open('txt.txt', 'w')
for block in Mat:
   for subblock in block:
       np.savetxt(f, block, fmt=...) # write to open file
       f.write('\n') # spacer line
   f.write('\n')  # another spacer
f.close()

更详细的答案:

How to write a multidimensional array to a text file?

【讨论】:

  • 感谢您的详细回答。我了解代码在做什么,但它与文档不一致。所以我只是想知道这是否是预期的行为。我猜答案是意料之中,而且文档是错误的..
  • 代码中没有什么比处理任何大于 2d 的东西的建议。文档中的大部分细节都是关于格式的,而不是数组。据我所知,没有将 3d 数组写入 CSV 文件的行业标准。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 2020-04-04
  • 2023-04-06
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多