Подтвердить что ты не робот

Как использовать python numpy.savetxt для записи строк и чисел с плавающей точкой в ​​файл ASCII?

У меня есть набор списков, содержащих как строки, так и числа с плавающей запятой, например:

import numpy as num

NAMES  = num.array(['NAME_1', 'NAME_2', 'NAME_3'])
FLOATS = num.array([ 0.5    , 0.2     , 0.3     ])

DAT =  num.column_stack((NAMES, FLOATS))

Я хочу собрать эти два списка вместе и записать их в текстовый файл в виде столбцов; поэтому я хочу использовать numpy.savetxt (если это возможно).

num.savetxt('test.txt', DAT, delimiter=" ") 

Когда я это сделаю, я получаю следующую ошибку:

>>> num.savetxt('test.txt', DAT, delimiter=" ") 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_9597b1f_20120920-py2.7-macosx-10.8-x86_64.egg/numpy/lib/npyio.py", line 1047, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: float argument required, not numpy.string_

Идеальный выходной файл будет выглядеть так:

NAME_1    0.5
NAME_2    0.2
NAME_3    0.3

Как я могу записать как строки, так и числа с плавающей точкой в ​​текстовый файл, возможно, избегая использования csv (я хочу сделать, если читаем для других людей)? Есть ли другой способ сделать это вместо использования numpy.savetxt?

4b9b3361

Ответ 1

Вы должны указать формат (fmt) ваших данных в savetxt, в данном случае в виде строки (%s):

num.savetxt('test.txt', DAT, delimiter=" ", fmt="%s") 

Формат по умолчанию - это float, поэтому он ожидал float вместо строки и объясняет сообщение об ошибке.

Ответ 2

В настоящее время принятый ответ фактически не затрагивает вопрос, который спрашивает, как сохранять списки, содержащие как строки, так и числа с плавающей запятой. Для полноты я предоставляю полностью рабочий пример, основанный, с некоторыми изменениями, на ссылке, приведенной в комментарии @joris.

import numpy as np

names  = np.array(['NAME_1', 'NAME_2', 'NAME_3'])
floats = np.array([ 0.1234 ,  0.5678 ,  0.9123 ])

ab = np.zeros(names.size, dtype=[('var1', 'U6'), ('var2', float)])
ab['var1'] = names
ab['var2'] = floats

np.savetxt('test.txt', ab, fmt="%10s %10.3f")

Обновление: Этот пример также корректно работает в Python 3 с помощью строки 'U6' Unicode dtype, создавая структурный массив ab вместо строки 'S6'. Последний dtype будет работать в Python 2.7, но будет писать строки типа b'NAME_1' в Python 3.