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

时间:2016-05-11 14:33:13

标签: python arrays numpy

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

final JSONObject json = Cards.getCards(getApplicationContext(), new CardsResponse() {
            @Override
            public void onResponseReceived(JSONObject response) {
                // Do stuff here
                Log.d("DebudIID", "Cards JSON : " + json);
            }
        });

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

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')

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

,它可以正常工作
float argument required, not numpy.ndarray

并且创建了非零文件

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

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

this plugin

  

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

     

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

     

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

     

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

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

1 个答案:

答案 0 :(得分: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?