In [115]: my_type = np.dtype([('single_int', np.int),
...: ('two_floats', np.float64, (2,))])
In [116]: my_var = np.array( [(1, (2., 3.)),
...: (4, (5., 6.))
...: ],
...: dtype=my_type)
In [117]: my_var
Out[117]:
array([(1, [2., 3.]), (4, [5., 6.])],
dtype=[('single_int', '<i8'), ('two_floats', '<f8', (2,))])
Прыжок прямо к шагу загрузки:
In [118]: txt = """1 2. 3.
...: 4 5. 6."""
In [119]: np.genfromtxt(txt.splitlines(), dtype=my_type)
Out[119]:
array([(1, [2., 3.]), (4, [5., 6.])],
dtype=[('single_int', '<i8'), ('two_floats', '<f8', (2,))])
Как я уже говорил, savetxt
просто делает:
for row in my_var:
f.write(fmt % tuple(row))
Так что мы должны, так или иначе другие, обходите или с базовым форматированием c Python %
. Либо так, либо напишите наш собственный текстовый файл. В savetxt
нет ничего волшебного. Это просто python.
===
Последние версии numpy включают функцию для "выравнивания" структурированного массива:
In [120]: import numpy.lib.recfunctions as rf
In [121]: arr = rf.structured_to_unstructured(my_var)
In [122]: arr
Out[122]:
array([[1., 2., 3.],
[4., 5., 6.]])
In [123]: np.savetxt('test.csv', arr, fmt='%d %f %f')
In [124]: cat test.csv
1 2.000000 3.000000
4 5.000000 6.000000
In [125]: np.genfromtxt('test.csv', dtype=my_type)
Out[125]:
array([(1, [2., 3.]), (4, [5., 6.])],
dtype=[('single_int', '<i8'), ('two_floats', '<f8', (2,))])
edit
Сохранение массива dtype объекта обходит множество проблем с форматированием:
In [182]: my_var
Out[182]:
array([(1, [2., 3.]), (4, [5., 6.])],
dtype=[('single_int', '<i8'), ('two_floats', '<f8', (2,))])
In [183]: def my_repr(o):
...: return [(elem['single_int'], *elem['two_floats']) for elem in o]
...:
In [184]: my_repr(my_var)
Out[184]: [(1, 2.0, 3.0), (4, 5.0, 6.0)]
In [185]: np.array(_,object)
Out[185]:
array([[1, 2.0, 3.0],
[4, 5.0, 6.0]], dtype=object)
In [186]: np.savetxt('f.txt', _, fmt='%d %f %f')
In [187]: cat f.txt
1 2.000000 3.000000
4 5.000000 6.000000