使用numpy.savetxt保存数据

时间:2018-07-17 15:13:08

标签: python file numpy save

我有numpy数组I。我正在使用以下命令将其写入文件中:

np.savetxt(fp, I[None], fmt='%e', delimiter=',')

它正在文件中写入数组,每个值用逗号分隔。现在,我想在其后追加一列。因此,如何在同一行中追加一些非数组数据值。

2 个答案:

答案 0 :(得分:0)

您可以只编辑文本文件并以这种方式添加非数组数据值:

np.savetxt(fp, I[None], fmt='%e', delimiter=',')
with open(fp,'a') as f:
    f.write("non-array data values")

答案 1 :(得分:0)

最简单的方法是将多余的数据连接起来,并用%s进行处理以处理文本

In [97]: I = np.arange(5)
In [98]: I[None]
Out[98]: array([[0, 1, 2, 3, 4]])


In [101]: np.savetxt('test',I[None],delimiter=',', fmt='%e')
In [102]: cat test
0.000000e+00,1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00

现在要添加文本列:

In [103]: lbl = np.array([['test']])
In [105]: np.hstack((I[None],lbl))
Out[105]: array([['0', '1', '2', '3', '4', 'test']], dtype='<U21')

现在这是所有字符串,因此您必须使用'%s'编写:

In [106]: np.savetxt('test',_,delimiter=',', fmt='%s')
In [107]: cat test
0,1,2,3,4,test

或创建一个object dtype数组,然后将自定义fmt应用于每一列:

In [108]: lbl = np.array([['test']],object)
In [109]: np.hstack((I[None],lbl))
Out[109]: array([[0, 1, 2, 3, 4, 'test']], dtype=object)
In [110]: np.savetxt('test',_,fmt='%d, %e, %e, %e, %e, %s')
In [111]: cat test
0, 1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, test

我还建议制作一个结构化数组,尽管此对象dtype可能更易于使用。

In [112]: dt = np.dtype('i,f,f,f,f,U10')
In [113]: arr = np.array([tuple(Out[109][0])],dt)
In [114]: arr
Out[114]: 
array([(0, 1., 2., 3., 4., 'test')],
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<U10')])
In [115]: np.savetxt('test',_,fmt='%d, %e, %e, %e, %e, %s')
In [116]: cat test
0, 1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, test

savetxt在输入数组的第一个维度上进行迭代,并使用您的fmt(或由您的fmt构造的一个)进行写入。如果您对Python格式和文件编写足够熟悉,则可以执行相同操作-并且运行速度也一样快。