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

Numpy.genfromtxt создает массив того, что выглядит как кортежи, а не 2D-массив - почему?

Я запускаю 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, она отлично работает и создает 2D-массив:

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

Ответ 1

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

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

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

EDIT. Если вы хотите использовать имена столбцов, вы можете использовать аргумент 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')