我正在尝试使用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',分隔符='',换行符='n',页眉='',页脚='',注释='#')[source]
将数组保存到文本文件中。参数:
fname:filename或文件句柄如果文件名以.gz结尾,则文件将自动保存为压缩的gzip格式。loadtxt透明地理解gzip文件。
X:array_like要保存到文本文件的数据。
其他人看到了吗?这是预期行为吗?
再次查看您更改错误消息的位置:
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()
更详细的答案是:
如何将多维数组写入文本文件?