Поведение конверторов в NumPy loadtxt не понято - PullRequest
4 голосов
/ 20 июня 2011

Я пытаюсь прочитать данные из текстового файла, используя numpy.loadtxt с аргументом преобразователей.У меня есть смесь столбцов и строк.Код:

a, b, c, d, e = np.loadtxt(infile, delimiter = ',', usecols=(0, 2, 5, 8, 9), skiprows = 1,
                           unpack = True, converters = dict(zip((0, 2, 5, 8, 9), (int, float, float, int, int))))

Данные считываются правильно и распаковываются правильно, но все переменные (a, b, c, d и e) заканчиваются как числа с плавающей запятой.Я делаю ошибку в синтаксисе конвертеров?

Изменить пробный ответ

Я пытался использовать dtype = (int, float, float, int, int), как это было@joris as:

a,b,c,d,e = np.loadtxt(infile,delimiter = ',', usecols=(0,2,5,8,9), skiprows = 1, unpack = True, dtype = (int,float,float,int,int))

Но я получаю следующую ошибку:

     41                                            skiprows = 1,
     42                                            unpack = True,
---> 43                                            dtype = (int,float,float,int,int))
     44
     45

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/npyio.pyc in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack)
    665     try:
    666         # Make sure we're dealing with a proper dtype

--> 667         dtype = np.dtype(dtype)
    668         defconv = _getconv(dtype)
    669

TypeError: data type not understood
WARNING: Failure executing file: <forward_NDMMF.py>

Я использую NumPy v. 1.5.1.

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Для указания типа различных столбцов вы можете использовать аргумент dtype вместо converters:

dtype=(int,float,float,int,int)

РЕДАКТИРОВАТЬ:

Очевидно, этот тип спецификации dtype, похоже, не работает с loadtxt, но он работает с genfromtxt ( Кто-нибудь знает, почему это не работает с loadtxt, или это одна из дополнительных возможностей genfromtxt? )

Если вы хотите использовать loadtxt, работает структурированная спецификация dtype с кортежами, например [('f0', int), ('f1', float)] вместо (int, float)

Но есть и другая проблема. При работе с такими структурированными dtypes и такими структурированными массивами (разные типы для разных столбцов), unpack, похоже, не работает. По крайней мере, на простом примере, который я попробовал. Но это может быть ошибка, которая уже решена: http://projects.scipy.org/numpy/ticket/1458 (но для этого вам нужно обновить до 1.6).

3 голосов
/ 21 июня 2011

В документации loadtxt указано, что converters должен содержать функции, которые специально возвращают числа с плавающей запятой :

преобразователей :dict, необязательно

Номер столбца отображения словаря в функцию, которая преобразует этот столбец в число с плавающей точкой.Например, если столбец 0 является строкой даты: converters = {0: datestr2num}.Конвертеры также можно использовать для предоставления значения по умолчанию для отсутствующих данных: convertters = {3: лямбда-ы: float (s или 0)}.По умолчанию: Нет.

Если вы хотите вместо этого целые числа, вам нужно разыграть числа с плавающей точкой, используя ключевое слово dtype.

>>> numpy.loadtxt('th.txt', delimiter=',', usecols=(0, 2, 3), converters=dict(zip((0, 2, 3), (float, float, float))), dtype=([('i1', '<i4'), ('i2', '<f4'), ('i3', '<i4')]))
array([(1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4), (1, 3.2000000476837158, 4),
       (1, 3.2000000476837158, 4)],
      dtype=[('i1', '<i4'), ('f1', '<f4'), ('i2', '<i4')])

Конечно, вына самом деле в этом случае converters не требуется - это действительно для преобразования произвольных строковых значений, таких как 'True', в числовые значения.Кроме того, если вы действительно хотите использовать простой двумерный массив вместо массива записей, не передавайте формат записи:

>>> numpy.loadtxt('th.txt', delimiter=',', usecols=(0, 2, 3), dtype=int)
array([[1, 3, 4],
       [1, 3, 4],
       [1, 3, 4],
       [1, 3, 4],
       [1, 3, 4],
       [1, 3, 4],
       [1, 3, 4],
       [1, 3, 4],
       [1, 3, 4]])

Но если вы сделаете это, вы не сможете указать формат по столбцу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...