Введение
При выполнении научных вычислений нам необходимо загружать данные извне.Сегодня я представлю очень полезный метод в NumPy, genfromtxt. genfromtxt можно разбить на два шага: первый шаг — чтение данных из файла и преобразование их в строку. Второй шаг — преобразовать строку в указанный тип данных.
Введение в genfromtxt
Сначала посмотрите на определение genfromtxt:
numpy.genfromtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=" !#$%&'()*+, -./:;<=>?@[\]^{|}~", replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
genfromtxt может принимать несколько параметров, среди такого количества параметров только fname является обязательным параметром, а остальные необязательны.
fname может принимать различные формы, которые могут бытьфайл, str, pathlib.Path, список str или генератор.
Если это одна строка, по умолчанию используется имя локального или удаленного файла. Если это список строк, то каждая строка обрабатывается как строка данных в файле. Если удаленный файл передан, файл будет автоматически загружен в локальный каталог.
genfromtxt также может автоматически определять, является ли файл типом сжатия, в настоящее время поддерживает два типа сжатия: gzip и bz2.
Далее, давайте взглянем на общие приложения genfromtxt:
Перед использованием обычно необходимо импортировать две библиотеки:
from io import StringIO
import numpy as np
StringIO сгенерирует объект String, который можно использовать в качестве входных данных для genfromtxt.
Давайте сначала определим StringIO, который содержит разные типы:
s = StringIO(u"1,1.3,abcde")
Этот StringIO содержит int, float и str. и разделитель,
.
Давайте рассмотрим простейшее использование genfromtxt:
In [65]: data = np.genfromtxt(s)
In [66]: data
Out[66]: array(nan)
Поскольку разделителем по умолчанию является delimiter=None, данные в StringIO будут преобразованы в массив целиком, и результатом будет nan.
Далее добавляем разделитель-запятую:
In [67]: _ = s.seek(0)
In [68]: data = np.genfromtxt(s,delimiter=",")
In [69]: data
Out[69]: array([1. , 1.3, nan])
На этот раз есть вывод, но последняя строка получает nan, потому что ее нельзя преобразовать в число с плавающей запятой.
Обратите внимание, что наша первая строка должна сбросить указатель StringIO на начало файла. Здесь мы используем s.seek(0).
Итак, как преобразовать последнюю строку? Нам нужно указать dtype вручную:
In [74]: _ = s.seek(0)
In [75]: data = np.genfromtxt(s,dtype=float,delimiter=",")
In [76]: data
Out[76]: array([1. , 1.3, nan])
Выше мы указали, что все типы массивов являются плавающими, также мы можем указать тип для каждого элемента массива отдельно:
In [77]: _ = s.seek(0)
In [78]: data = np.genfromtxt(s,dtype=[int,float,'S5'],delimiter=",")
In [79]: data
Out[79]: array((1, 1.3, b'abcde'), dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<U')])
Мы используем int, float и str соответственно для преобразования типов в файле и видим, что получен правильный результат.
Помимо указания типа, мы также можем указать имя.В приведенном выше примере мы не указывали имя, поэтому используются значения по умолчанию f0, f1 и f2. См. пример указания имен:
In [214]: data = np.genfromtxt(s, dtype="i8,f8,S5",names=['myint','myfloat','mystring'], delimiter=",")
In [215]: data
Out[215]:
array((1, 1.3, b'abcde'),
dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])
Помимо использования символов, разделители также могут использовать индекс:
In [216]: s = StringIO(u"11.3abcde")
In [217]: data = np.genfromtxt(s, dtype=None, names=['intvar','fltvar','strvar'],
...: delimiter=[1,3,5])
In [218]: data
Out[218]:
array((1, 1.3, b'abcde'),
dtype=[('intvar', '<i8'), ('fltvar', '<f8'), ('strvar', 'S5')])
Выше мы использовали index как разделение s.
Многомерные массивы
Если в данных есть новые строки, вы можете использовать genfromtxt для создания многомерного массива:
>>> data = u"1, 2, 3\n4, 5, 6"
>>> np.genfromtxt(StringIO(data), delimiter=",")
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
autostrip
использоватьautostrip
Вы можете удалить пробелы вокруг данных:
>>> data = u"1, abc , 2\n 3, xxx, 4"
>>> # Without autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5")
array([['1', ' abc ', ' 2'],
['3', ' xxx', ' 4']], dtype='<U5')
>>> # With autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5", autostrip=True)
array([['1', 'abc', '2'],
['3', 'xxx', '4']], dtype='<U5')
comments
Комментарии по умолчанию — # , все данные, начинающиеся с #, считаются комментариями.
>>> data = u"""#
... # Skip me !
... # Skip me too !
... 1, 2
... 3, 4
... 5, 6 #This is the third line of the data
... 7, 8
... # And here comes the last line
... 9, 0
... """
>>> np.genfromtxt(StringIO(data), comments="#", delimiter=",")
array([[1., 2.],
[3., 4.],
[5., 6.],
[7., 8.],
[9., 0.]])
пропустить строки и выбрать столбцы
можно использоватьskip_header
иskip_footer
чтобы пропустить определенные строки возвращаемого массива:
>>> data = u"\n".join(str(i) for i in range(10))
>>> np.genfromtxt(StringIO(data),)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>>> np.genfromtxt(StringIO(data),
... skip_header=3, skip_footer=5)
array([ 3., 4.])
можно использоватьusecols
чтобы выбрать определенное количество строк:
>>> data = u"1 2 3\n4 5 6"
>>> np.genfromtxt(StringIO(data), usecols=(0, -1))
array([[ 1., 3.],
[ 4., 6.]])
Если столбец имеет имя, вы можете использоватьusecols
Чтобы выбрать имена столбцов:
>>> data = u"1 2 3\n4 5 6"
>>> np.genfromtxt(StringIO(data),
... names="a, b, c", usecols=("a", "c"))
array([(1.0, 3.0), (4.0, 6.0)],
dtype=[('a', '<f8'), ('c', '<f8')])
>>> np.genfromtxt(StringIO(data),
... names="a, b, c", usecols=("a, c"))
array([(1.0, 3.0), (4.0, 6.0)],
dtype=[('a', '<f8'), ('c', '<f8')])
Эта статья была включена вwoohoo.floydpress.com/06-python-вы…
Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!
Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!