TypeError:数组dtype(' float64')和格式说明符之间不匹配

时间:2017-08-09 01:30:09

标签: python arrays numpy

我有一个尺寸为1000 * 30 * 150的numpy数组。我试图将其保存为txt文件。到目前为止,我已经尝试了这个

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 1254, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: only length-1 arrays can be converted to Python scalars

During handling of the above exception, another exception occurred:

Traceback (most recent call last):


        np.savetxt("test.txt", train, fmt='%.5f', delimiter=",")
      File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 1258, in savetxt
        % (str(X.dtype), format))
    TypeError: Mismatch between array dtype ('float64') and format specifier ('%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f,%.5f')

两种方法都给我错误

Error:
    ContractsControllerTest#test_should_get_show:
    ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError

Error:
    ContractsControllerTest#test_should_get_show:
    NoMethodError: undefined method `each' for nil:NilClass

5 个答案:

答案 0 :(得分:4)

问题是你的阵列是三维的,不能以二维格式保存。要么重塑它,所以它是2d:

mydata = mydata.reshape(mydata.shape[0],mydata.shape[1]*mydata.shape[2])
np.savetxt('text.txt',mydata,fmt='%.5f',delimiter=',')

或者如果您不需要将其作为文本文件阅读并希望稍后在python使用中重新加载它:

np.save('text.npy',mydata)

答案 1 :(得分:2)

你没有提到将三维数组写入文本文件的目的是什么,你将来会再读它,你想要的是什么格式,但这是一种可能性:

import json
print(json.dumps(mydata, default=lambda x: list(x), indent=4))

如果您澄清目的,人们将能够提出更合适的解决方案。

答案 2 :(得分:1)

告诉我们mydata。特别是其dtypeshape

要以%.5f格式保存,它需要是一个二维数组。

savetxt大致如此:

 for row in arr:
   print(format % tuple(row))

其中format是根据您的fmt参数和数组中的数字列构建的。您的数组看起来有很多列,因此format'%.5f,%.5f,%.5f,%.5f,%.5f,%...字符串。

需要

tuple才能将1d数组row转换为与format%()一起使用的元组。

如果数组是更高的维度或对象数组,则会出现问题。

编辑 - 所以你说数组是1000 * 30 * 150。因此它尝试迭代1000行,30看起来像format的大小。但它无法将其应用于(30,150)数组。

使用openrow迭代,您会得到相同的错误吗?在Py3中,您可能需要使用'wb'. Iterating yourself on the first dimension means each savetxt call works with a 30x150 array. It will iterate on the 30, and try to format rows of 150. The would create a larger格式打开,但我认为这样会运行。

在任何情况下,savetxt都是为2d数字数组设计的。 3d需要某种软糖。请记住,csv读者也不是为3d数组设计的。他们期望具有一致列的行由简单的分隔符分隔。

In [260]: arr = np.arange(24).reshape(4,3,2)

它可以使用3d - 如果允许使用%s格式化每个子目录:

In [261]: np.savetxt('test',arr, fmt='%s')
In [262]: cat test
[0 1] [2 3] [4 5]
[6 7] [8 9] [10 11]
[12 13] [14 15] [16 17]
[18 19] [20 21] [22 23]

三维数字格式 - 错误

In [263]: np.savetxt('test',arr, fmt='%d')
....
TypeError: Mismatch between array dtype ('int32') and format specifier ('%d %d %d')

重塑3d到2d - 保存工作:

In [264]: np.savetxt('test',arr.reshape(-1,2), fmt='%d')
In [265]: cat test
0 1
2 3
4 5
6 7
8 9
...
22 23

进行额外的迭代;可以在块之间添加一个空行

In [267]: with open('test','wb') as f:
     ...:     for row in arr:
     ...:         np.savetxt(f, row, '%d',delimiter=', ')
     ...:         
In [268]: cat test
0, 1
2, 3
4, 5
6, 7
...
22, 23

答案 3 :(得分:0)

np.savetxt()的替代方法可能是使用csv模块:

with open("filename.","w+") as my_csv:            # writing the file as my_csv
    csvWriter = csv.writer(my_csv,delimiter=',')  # using the csv module to write the file
    csvWriter.writerows(array_2d)                 # write every row in the matrix

我遇到了与numpy类似的TypeError问题,但CSV方法似乎工作正常。

答案 4 :(得分:0)

如果您希望沿mydata[i,:,:]处的轴以格式化的行和列的形式写出数据,以产生更具可读性的表格式,请参见以下答案:How to write a multidimensional array to a text file? @JoeKington。我的代码在每个切片的行和列之间添加了一个循环,因为在实现原始代码时找不到TypeError导致的其他任何分辨率:

    with open('test.txt', 'w') as outfile:
        # Add header giving shape of array
        # Any line starting with "#" will be ignored by numpy.loadtxt
        outfile.write('# Array shape: {0}\n'.format(x_train.shape))

        # Iterating through a ndimensional array produces slices along
        # the last axis. This is equivalent to data[i,:,:] in this case
        sliceCount = 0
        for data_slice in x_train:
            # Keep track of the slice numbers
            outfile.write('# New slice %d\n'%sliceCount)

            # Work through each row and column of the 2d numpy array inside the 
            # slice, writing each column number to file in format of your choosing
            for row in data_slice:
                for col in row:
                    itemStr = "%8.6f,"%col
                    outfile.write(itemStr)
                outfile.write("\n")

            sliceCount += 1