将numpy数组保存到csv会产生TypeError Mismatch

时间:2016-04-11 15:23:24

标签: python arrays csv numpy typeerror

我有一个numpy数组,其中包含以下格式的数字数据:

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)])

所以它是10个组的数组,其中每个组由2个相等长度的列表组成,只包含数字。 运行以下保存代码会给出以下错误:

numpy.savetxt('exampleData.csv', test, delimiter=',')
TypeError: Mismatch between array dtype ('int32') and format specifier ('%.18e %.18e')

我猜这可以通过fmt =' xyz'中的内容来解决。论证,但文件并不是特别清楚。任何帮助将不胜感激。

(在我的实际数据中,i和j列表是长浮点数列表,例如' 0.0047322940571'等。)

2 个答案:

答案 0 :(得分:9)

您的example是一个3d数组

In [82]: example=np.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for  k in range(0, 3)])  # chg 10 to 3 for display

In [83]: example.shape
Out[83]: (3L, 2L, 5L)

In [84]: example
Out[84]: 
array([[[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]],

       [[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]],

       [[0, 1, 2, 3, 4],
        [0, 0, 0, 0, 0]]])

尝试保存整个内容会导致错误(由于版本不同而导致不同的消息):

In [87]: np.savetxt('test.csv',example, delimiter=',')
....
TypeError: float argument required, not numpy.ndarray 

但保存一个'行'是可以的

In [88]: np.savetxt('test.csv',example[1,...], delimiter=',')

使用整数格式保存可以产生更漂亮的输出

In [94]: np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%d')

In [95]: with open('test.csv') as f:print f.read()
0,1,2,3,4
0,0,0,0,0

那么你想如何保存3d数组呢?请记住您将如何使用/阅读它。多个文件?一个文件中有多个块?

https://stackoverflow.com/a/3685339/901925 关于如何保存3d数组是一个6岁的答案。简单的答案是打开一个文件,并为数组的切片执行多个savetxt。这将数据保存在块中。但加载这些块是另一个问题(之前出现过)。

In [100]: with open('test.csv','w') as f:
     ...:     for row in example:
     ...:         np.savetxt(f,row,delimiter=',',fmt='%d',footer='====')
     ...:         

In [101]: with open('test.csv') as f:print f.read()
0,1,2,3,4
0,0,0,0,0
# ====
0,1,2,3,4
0,0,0,0,0
# ====
0,1,2,3,4
0,0,0,0,0
# ====

在回复您的评论时,这是有效的

example=np.ones((4,2,100))
np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%.18e')

保存3d数组的另一种方法是将其重塑为2d。您在加载后将其重新整形为3d,可能使用存储在注释行中的信息

np.savetxt('test.csv',example.reshape(-1,example.shape[-1]), delimiter=',',fmt='%.18e')

答案 1 :(得分:0)

import numpy

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)])
f = open('exampleData.csv', 'ab')
for i in example:
    numpy.savetxt(f, i, fmt='%i')