numpy.genfromtxt создает массив, похожий на кортежи, а не двумерный массив - почему? - PullRequest
33 голосов
/ 02 марта 2012

Я бегу genfromtxt как показано ниже:

date_conv = lambda x: str(x).replace(":", "/")
time_conv = lambda x: str(x)

a = np.genfromtxt(input.txt, delimiter=',', skip_header=4,
      usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv})

Где input.txt от этой сущности .

Когда я смотрю на результаты, это 1D массив, а не 2D массив:

>>> np.shape(a)
(918,)

Вместо этого он выглядит как массив кортежей:

>>> a[0]
('06/03/2006', '08:27:23', 6.4e-05, 0.000336, 0.001168, 0.002716, 0.004274, 0.004658, 0.003756, 0.002697, 0.002257, 0.002566, 0.003522, 0.004471, 0.00492, 0.005602, 0.006956, 0.008442, 0.008784, 0.006976, 0.003917, 0.001494, 0.000379, 6.4e-05)

Если я удаляю спецификацию преобразователей из вызова genfromtxt, она работает нормально и создает двумерный массив:

>>> np.shape(a)
(918, 24)

1 Ответ

46 голосов
/ 02 марта 2012

То, что возвращается, называется структурированным ndarray , см., Например, здесь: http://docs.scipy.org/doc/numpy/user/basics.rec.html. Это потому, что ваши данные не являются однородными, то есть не все элементы имеют одинаковый тип: данные содержат оба строки (первые два столбца) и плавающие. Numpy массивы должны быть однородными (см. здесь для объяснения).

Структурированные массивы «решают» это ограничение однородности, используя кортежи для каждой записи или строки, поэтому возвращаемый массив является 1D: одна серия кортежей, но каждый кортеж (строка) состоит из нескольких данных, так что вы можете расцените это как строки и столбцы. Различные столбцы доступны как a['nameofcolumn'], в вашем случае, например, a['Julian_Day'].

Причина, по которой он возвращает двумерный массив при удалении преобразователей для первых двух столбцов, заключается в том, что в этом случае genfromtxt относится ко всем данным одного типа, и возвращается нормальный ndarray (тип по умолчанию - float, но вы можете указать это с помощью аргумента dtype).

РЕДАКТИРОВАТЬ : Если вы хотите использовать имена столбцов, вы можете использовать аргумент names (и установить skip_header только в три):

a2 = np.genfromtxt("input.txt", delimiter=',', skip_header=3, names = True, dtype = None,
                  usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv})

вы можете сделать, например:

>>> a2['Dateddmmyyyy']
array(['06/03/2006', '06/03/2006', '18/03/2006', '19/03/2006',
       '19/03/2006', '19/03/2006', '19/03/2006', '19/03/2006',
       '19/03/2006', '19/03/2006'], 
      dtype='|S10')
...