Импортировать файл в Python (numpy) как непрерывный массив памяти - PullRequest
0 голосов
/ 07 июня 2018

Я хочу импортировать данные из текстового файла и считывать их как непрерывный массив памяти.Это данные, где каждый респондент отделен от ответа:

['vrouw', 43, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']

['vrouw', 34, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']

['vrouw', 32, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']

['vrouw', 32, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']

['vrouw', 43, '3', 'sport', '2', '2', 'onbeantwoord', '']

['vrouw', 32, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']

['vrouw', 43, '2', 'onbeantwoord', '3', '3', 'collega', 'nee']

Я попытался использовать следующий код для импорта данных из текстового файла:

vragenlijst_data= np.genfromtxt('antwoorden.txt', delimiter=',', dtype=None, names=('geslacht', 'leeftijd', 'stelling1', 'doorvraag1', 'stelling2', 'stelling3', 'doorvraag3', 'opmerking'))

Однако, таким образом, я не могу использовать np.mean (из библиотеки numpy) в векторизованном виде, потому что у меня нет смежного массива памяти.Кто-нибудь знает способ чтения данных, чтобы у меня был непрерывный массив памяти (желательно с numpy)?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

ваши данные искажены, похоже, это просто вывод print.я не думаю, что вы найдете какую-либо библиотечную функцию, чтобы сделать ваши данные пригодными для использования (gentext создает массив с искаженными данными).Итак, вот что:

import re

with open('antwoorden.txt') as f:
    lines = f.readlines()

vragenlijst = []
for line in lines:
    line = re.sub("[',\[\]]", '', line.strip())
    line = [x for x in line.split()]
    if len(line)==7:
        line += ['']
    vragenlijst.append(tuple(line))

vragenlijst теперь представляет собой список из 8 кортежей, в котором каждый член является строкой.кортежи необходимы для структурированных массивов numpy.так что теперь вы создаете свой dtype следующим образом:

vragenlijst_dtype = np.dtype([('geslacht', 'U10'), ('leeftijd', 'i4'), 
        ('stelling1', 'U10'), ('doorvraag1', 'U10'), ('stelling2', 'U10'), 
        ('stelling3', 'U10'), ('doorvraag3', 'U10'), ('opmerking', 'U10')])

, где "U10" означает юникод длиной 10 символов, а i4 - целое число 4 байта.Вы можете изменить типы, если они не соответствуют вашим реальным данным.

, а затем:

vragenlijst = np.array(vragenlijst, dtype=vragenlijst_dtype)
list_mean = np.mean(vragenlijst['leeftijd'])

, что выдает "37.0"

0 голосов
/ 07 июня 2018

С копией-n-вставкой ваших строк:

In [362]: txt
Out[362]: "['vrouw', 43, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']\n\n['vrouw', 34, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']\n\n['vrouw', 32, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']\n\n['vrouw', 32, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']\n\n['vrouw', 43, '3', 'sport', '2', '2', 'onbeantwoord', '']\n\n['vrouw', 32, '2', 'onbeantwoord', '2', '2', 'onbeantwoord', '']\n\n['vrouw', 43, '2', 'onbeantwoord', '3', '3', 'collega', 'nee']"

In [364]: data = np.genfromtxt(txt.splitlines(), delimiter=',',dtype=None, encoding=None)
In [365]: data
Out[365]: 
array([("['vrouw'", 43, " '2'", " 'onbeantwoord'", " '2'", " '2'", " 'onbeantwoord'", " '']"),
       ("['vrouw'", 34, " '2'", " 'onbeantwoord'", " '2'", " '2'", " 'onbeantwoord'", " '']"),
       ("['vrouw'", 32, " '2'", " 'onbeantwoord'", " '2'", " '2'", " 'onbeantwoord'", " '']"),
       ("['vrouw'", 32, " '2'", " 'onbeantwoord'", " '2'", " '2'", " 'onbeantwoord'", " '']"),
       ("['vrouw'", 43, " '3'", " 'sport'", " '2'", " '2'", " 'onbeantwoord'", " '']"),
       ("['vrouw'", 32, " '2'", " 'onbeantwoord'", " '2'", " '2'", " 'onbeantwoord'", " '']"),
       ("['vrouw'", 43, " '2'", " 'onbeantwoord'", " '3'", " '3'", " 'collega'", " 'nee']")],
      dtype=[('f0', '<U8'), ('f1', '<i8'), ('f2', '<U4'), ('f3', '<U15'), ('f4', '<U4'), ('f5', '<U4'), ('f6', '<U15'), ('f7', '<U7')])

Результатом является 1d структурированный массив со смесью строковых и числовых полей, на которые нужно ссылаться по имени, а не по номеру столбца.

'f1' является числовым, потому что в оригинале нет кавычек.Таким образом, можно просмотреть это поле и легко взять его среднее значение:

In [367]: data['f1']
Out[367]: array([43, 34, 32, 32, 43, 32, 43])
In [368]: np.mean(data['f1'])
Out[368]: 37.0

genfromtxt не удаляет скобки, поэтому у строк 'f0' они по-прежнему есть.

Дополнительный слойкавычки также затрудняют преобразование других полей в целое число.

Если бы файл имел более чистые значения CSV, его было бы легче читать и использовать:

In [372]: txt1 = """vrouw, 43, 2, onbeantwoord, 2, 2, onbeantwoord, ''
     ...: vrouw, 34, 2, onbeantwoord, 2, 2, onbeantwoord, '' """
     ...: 
In [373]: 
In [373]: data1 = np.genfromtxt(txt1.splitlines(), delimiter=',',dtype=None, enc
     ...: oding=None)
In [374]: data1
Out[374]: 
array([('vrouw', 43, 2, ' onbeantwoord', 2, 2, ' onbeantwoord', " ''"),
       ('vrouw', 34, 2, ' onbeantwoord', 2, 2, ' onbeantwoord', " ''")],
      dtype=[('f0', '<U5'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<U13'), ('f4', '<i8'), ('f5', '<i8'), ('f6', '<U13'), ('f7', '<U3')])
In [375]: data1['f0']
Out[375]: array(['vrouw', 'vrouw'], dtype='<U5')
In [376]: data1['f1']
Out[376]: array([43, 34])
In [377]: data1['f5']
Out[377]: array([2, 2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...