本质上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)
将 4 个 int 嵌套在 label1 中,很难找到一种有效的格式。问题在于如何进行 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 以所需格式逐个元素地排列数组,则可以将该格式写入文件。