genfromtxt dtype=None возвращает неправильную форму

#csv #numpy #genfromtxt

#csv #numpy #genfromtxt

Вопрос:

Я новичок в numpy, и мне трудно считывать CSV в массив numpy с помощью genfromtxt.

Я нашел в Интернете файл CSV, который я использую в качестве примера. Это смесь чисел с плавающей запятой и строк. Это здесь: http://pastebin.com/fMdRjRMv

Я использую numpy через pylab (инициализация в системе Ubuntu через: ipython -pylab). numpy.version.version — 1.3.0.

Вот что я делаю:

Пример #1:

 data = genfromtxt("fMdRjRMv.txt", delimiter=',', dtype=None)

data.shape

(374, 15)


data[10,10] ## Take a look at an example element

'30'

type(data[10,10])

type 'numpy.string_'
  

В файле CSV нет ошибочных кавычек, поэтому я понятия не имею, почему он должен думать, что число является строкой. Кто-нибудь знает, почему это так?

Пример #2 (пропуск первой строки):

data = genfromtxt(«fMdRjRMv.txt «, разделитель=’,’, dtype=Нет, пропуски =1)

данные.форма

(373,)

Кто-нибудь знает, почему он не будет считывать все это в 1-мерный массив?

Большое спасибо!

Ответ №1:

В вашем примере # 1 проблема в том, что все значения в одном столбце должны иметь один и тот же тип данных. Поскольку первая строка вашего файла данных содержит имена столбцов, это означает, что тип данных каждого столбца — string .

В примере № 2 у вас есть правильная идея пропустить первую строку. Однако обратите внимание, что 1.3.0 — довольно старая версия (у меня 1.6.1). В более новых версиях skiprows не рекомендуется, и вы должны использовать skip_header вместо этого.

Причина, по которой форма массива такова (373,) , заключается в том, что это структурированный массив (см. http://docs.scipy.org/doc/numpy/user/basics.rec.html ), который numpy использует для представления неоднородных данных. So data[10] дает вам целую строку вашей таблицы. Вы также можете получить доступ к столбцам данных, например, по имени data['f10'] . Вы можете найти имена столбцов в data.dtype.names . Также можно использовать исходные имена столбцов, которые определены в первой строке вашего файла данных:

  data = genfromtxt("fMdRjRMv.txt", dtype=None, delimiter=',', names=True)
  

затем вы можете получить доступ к столбцу, подобному data['Age'] .

Комментарии:

1. Огромное спасибо, это невероятно полезно. Я надеюсь, вы не возражаете ответить на эти два вопроса: (1) Как я могу получить доступ к определенному значению в структурированном массиве [скажем, 3-я запись в 10-й строке]? и (2) есть ли способ изменить форму массива, чтобы превратить его в форму 373×15? Еще раз огромное спасибо.

2. Хорошо, хорошо, я сам ответил на вопрос (1). Просто данные [‘Возраст’][10] сделали бы свое дело.

3. @DanEvans: что касается вашего второго продолжения, я боюсь, что вы не можете заставить его быть обычным массивом numpy, если столбцы имеют разные типы данных. Итак, если вам нужна вся таблица, тогда все должно быть строкой, как в вашем исходном примере # 1, что, вероятно, не очень полезно для вас. В качестве альтернативы вы можете выбрать только числовые столбцы и заставить их все быть плавающими. PS Если вы нашли мой ответ полезным, пожалуйста, подумайте о том, чтобы принять его и / или проголосовать за него.

4. Большое спасибо! Я действительно ценю ваше время. Я «принял» ваш ответ, нажав на галочку. К сожалению, мой статус недостаточно высок, чтобы поддержать его, но, надеюсь, другой пользователь поможет!