Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python np.savetxt似乎不适用于n-d数组_Python_Arrays_Numpy - Fatal编程技术网

Python np.savetxt似乎不适用于n-d数组

Python np.savetxt似乎不适用于n-d数组,python,arrays,numpy,Python,Arrays,Numpy,我试图使用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", m

我试图使用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文档没有提到任何关于数组维度的内容,只是说它“类似于数组”

numpy.savetxt(fname,X,fmt='%.18e',分隔符='',换行符='\n',页眉='',页脚='',注释='#')[来源]

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

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

X:数组_-like 要保存到文本文件的数据


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

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

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

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()
一个更详细的答案是:


那么,您想要什么格式的输出?如何在二维文本文件中表示一个4维数组,目前还不清楚。
savetxt
创建一个
csv
样式的文件,可以使用
loadtxt
加载。它遍历
,并将每一行写入字符串格式的行。我只是在寻找一些可以保存的内容,稍后再重新加载。因此,二进制文件
save
目前对我来说是可行的,但我很好奇,因为
savetxt
的实现似乎与文档一致。只有在需要人工读取的情况下,将数字数据保存在文本文件中才有意义。与二进制格式相比,文本文件的读写速度较慢,存储空间的利用效率也较低。它还有一个优点,即它的便携性更高,既可以被其他程序/语言读取,也可以在5年后读取文件,即使二进制
numpy
格式发生了变化。顺便说一句,我真的不知道为什么这会变成一个文本对二进制的论点。希望将数据保存为文本是一个合法的用例。如果
savetxt
不支持n-d数组,我不认为期望它被记录为这样是不合理的-即
将数组保存到文本文件中
->
将一维或二维数组保存到文本文件中
,感谢您的详细回答。我理解代码在做什么,但它与文档不一致。所以我只是想知道这是否是预期的行为。我猜答案是这是意料之中的,而文档是错误的。代码中没有什么比处理2d更大的东西更值得推荐的了。文档中的大多数详细信息都是关于格式的,而不是数组。据我所知,没有将3d阵列写入CSV文件的行业标准。