数组的numpy.savetxt格式说明符

时间:2017-11-02 12:42:50

标签: python arrays numpy format

我使用numpy.savetxt保存dtype=[('time','S8'),('channels', 'float16', 2)]的矩阵 这个矩阵的一行看起来像:

(b'12:31:24', [ 1.20019531,  4.        ])

有没有办法指定这种格式?我试图使用fmt='%s %.3f %.3f',但它无效。 numpy.savetxt需要pythonic格式说明符,而不是numpy dtype,我无法弄清楚如何指定数组。

如果我使用不同的dtype=[('time','S8'),('channel0', 'float16'),('channel1', 'float16')]一切正常,因为我摆脱了这个数组并且只获得了带浮点数的列但是我想使用带有一个字符串和每行数组的dtype(还有更多的通道)我的设备并将数据存储在一个数组中简化了迭代)

1 个答案:

答案 0 :(得分:0)

genfromtxt可以在同一文本中使用您的任何一个dtypes:

In [629]: txt = b"1,2,3\n4,5,6"
In [630]: dt=[('time','S8'),('channels', 'float16', 2)]
In [631]: np.genfromtxt(txt.splitlines(),delimiter=',',dtype=dt)
Out[631]: 
array([(b'1', [ 2.,  3.]), (b'4', [ 5.,  6.])],
      dtype=[('time', 'S8'), ('channels', '<f2', (2,))])

In [632]: dt2=[('time','S8'),('channel0', 'float16'),('channel1', 'float16')]
In [633]: np.genfromtxt(txt.splitlines(),delimiter=',',dtype=dt2)
Out[633]: 
array([(b'1',  2.,  3.), (b'4',  5.,  6.)],
      dtype=[('time', 'S8'), ('channel0', '<f2'), ('channel1', '<f2')])

view可以在两个dtypes之间进行转换,因为数据缓冲区布局是相同的。所以你可以写一个&#39; flat&#39;文件

In [638]: data
Out[638]: 
array([(b'1', [ 2.,  3.]), (b'4', [ 5.,  6.])],
      dtype=[('time', 'S8'), ('channels', '<f2', (2,))])
In [639]: data.view(dt2)
Out[639]: 
array([(b'1',  2.,  3.), (b'4',  5.,  6.)],
      dtype=[('time', 'S8'), ('channel0', '<f2'), ('channel1', '<f2')])
In [640]: np.savetxt('foo', data.view(dt2), fmt='%s %.3f %.3f')
In [641]: cat foo
b'1' 2.000 3.000
b'4' 5.000 6.000

In [642]: data = np.genfromtxt('foo',dtype=dt)
In [643]: data
Out[643]: 
array([(b"b'1'", [ 2.,  3.]), (b"b'4'", [ 5.,  6.])],
      dtype=[('time', 'S8'), ('channels', '<f2', (2,))])
In [644]: