如何将numpy.savetxt与包含数组的结构化数组一起使用

时间:2017-03-21 21:28:53

标签: python csv numpy

假设我有一个结构化数组,如下所示:

a = np.zeros(10,dtype=[('label1',np.int32, 4), ('label2', np.float_)])

我尝试将其保存为csv文件:

np.savetxt('output.csv', a, fmt='%d,%d,%d,%d,%f')

Python将生成此错误:

ValueError: fmt has wrong number of % formats:  %d,%d,%d,%d,%f

我还没有能够创建适合我输出的fmt字符串。 %s在这里不适合我,因为我需要能力指定浮动的格式。

是否可以从这种类型的结构化数组创建csv文件?

1 个答案:

答案 0 :(得分:1)

实质上savetxt的作用是:

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

因此fmt必须使用row,或者在这种情况下,是数组的元素。

In [330]: a = np.zeros(10,dtype=[('label1',np.int32, 4), ('label2', np.float_)])
     ...: 
In [331]: a
Out[331]: 
array([([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.),
       ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.),
       ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.), ([0, 0, 0, 0],  0.),
       ([0, 0, 0, 0],  0.)], 
      dtype=[('label1', '<i4', (4,)), ('label2', '<f8')])
In [332]: a[0]
Out[332]: ([0, 0, 0, 0],  0.)
In [333]: tuple(a[0])
Out[333]: (array([0, 0, 0, 0]), 0.0)

label1中嵌入4个整数会使得很难找到有效的格式。这是Python'%'格式化的问题。

In [334]: '%s, %f'%_
Out[334]: '[0 0 0 0], 0.000000'

如果a是5个字段,则会更容易

In [335]: a = np.zeros(10,dtype='i,i,i,i,f')
In [336]: a
Out[336]: 
array([(0, 0, 0, 0,  0.),....
       (0, 0, 0, 0,  0.)], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<f4')])
In [337]: tuple(a[0])
Out[337]: (0, 0, 0, 0, 0.0)
In [338]: '%d, %d, %d, %d, %f'%tuple(a[0])
Out[338]: '0, 0, 0, 0, 0.000000'

我认为您需要'压扁'数组的结构,或者编写自定义savetxt。正如我所指出的那样savetxt并不华丽。如果您可以按所需格式逐个元素print,则可以将该格式写入文件。