#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. Большое спасибо! Я действительно ценю ваше время. Я «принял» ваш ответ, нажав на галочку. К сожалению, мой статус недостаточно высок, чтобы поддержать его, но, надеюсь, другой пользователь поможет!