【发布时间】:2018-07-17 15:13:08
【问题描述】:
我有 numpy 数组 I。我正在使用以下方法将其写入文件:
np.savetxt(fp, I[None], fmt='%e', delimiter=',')
它在文件中写入数组,每个值用逗号分隔。现在我想在 I 之后再追加一列。那么如何在同一行中追加一些非数组数据值。
【问题讨论】:
-
你知道
structured数组吗?
我有 numpy 数组 I。我正在使用以下方法将其写入文件:
np.savetxt(fp, I[None], fmt='%e', delimiter=',')
它在文件中写入数组,每个值用逗号分隔。现在我想在 I 之后再追加一列。那么如何在同一行中追加一些非数组数据值。
【问题讨论】:
structured数组吗?
最简单的就是把多余的数据串联起来,用%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 格式化和文件写入足够熟悉,您也可以这样做 - 并且运行速度一样快。
【讨论】:
您可以编辑文本文件并以这种方式添加非数组数据值:
np.savetxt(fp, I[None], fmt='%e', delimiter=',')
with open(fp,'a') as f:
f.write("non-array data values")
【讨论】: