Проблемы с dtype NumPy в genfromtxt (), считывает строку как bytestring
Я хочу прочитать в стандартном CSV-файле ascii в numpy, который состоит из поплавков и строк.
Е. Г.,
ZINC00043096,C.3,C1,-0.1540,methyl
ZINC00043096,C.3,C2,0.0638,methylene
ZINC00043096,C.3,C4,0.0669,methylene
ZINC00090377,C.3,C7,0.2070,methylene
...
что бы я ни пытался, результирующий массив будет выглядеть как
Е. Г.,
all_data = np.genfromtxt(csv_file, dtype=None, delimiter=',')
[(b'ZINC00043096', b'C.3', b'C1', -0.154, b'methyl')
(b'ZINC00043096', b'C.3', b'C2', 0.0638, b'methylene')
(b'ZINC00043096', b'C.3', b'C4', 0.0669, b'methylene')
однако я хочу сохранить шаг для преобразования байт-строки и задавался вопросом, как я могу читать в строковых столбцах как обычную строку напрямую.
я попробовал несколько вещей из numpy.документация genfromtxt (), например, dtype='S,S,S,f,S'
или dtype='a25,a25,a25,f,a25'
, но здесь ничего не помогло.
Я боюсь, но я думаю, я просто не понимаю, как преобразование dtype действительно работает...Было бы неплохо, если бы вы могли дать мне подсказку здесь!
спасибо
3 ответов
В Вместо Python2.7
array([('ZINC00043096', 'C.3', 'C1', -0.154, 'methyl'),
('ZINC00043096', 'C.3', 'C2', 0.0638, 'methylene'),
('ZINC00043096', 'C.3', 'C4', 0.0669, 'methylene'),
('ZINC00090377', 'C.3', 'C7', 0.207, 'methylene')],
dtype=[('f0', 'S12'), ('f1', 'S3'), ('f2', 'S2'), ('f3', '<f8'), ('f4', 'S9')])
в Python3
array([(b'ZINC00043096', b'C.3', b'C1', -0.154, b'methyl'),
(b'ZINC00043096', b'C.3', b'C2', 0.0638, b'methylene'),
(b'ZINC00043096', b'C.3', b'C4', 0.0669, b'methylene'),
(b'ZINC00090377', b'C.3', b'C7', 0.207, b'methylene')],
dtype=[('f0', 'S12'), ('f1', 'S3'), ('f2', 'S2'), ('f3', '<f8'), ('f4', 'S9')])
"регулярные" строки в Python3 являются unicode. Но в вашем текстовом файле есть строки байтов. all_data
одинаково в обоих случаях (136 байт), но способ отображения строки байта Python3 -b'C.3'
, не только "C. 3".
какие операции вы планируете делать с этими строками? 'ZIN' in all_data['f0'][1]
работает с версии 2.7, но в 3 Вы должны использовать b'ZIN' in all_data['f0'][1]
.
переменная / неизвестная длина строки / Unicode dtype в numpy
напоминает мне, что вы можете указать строковый тип unicode в dtype
. Однако это становится более сложным, если вы заранее не знаете длины строк.
alttype = np.dtype([('f0', 'U12'), ('f1', 'U3'), ('f2', 'U2'), ('f3', '<f8'), ('f4', 'U9')])
all_data_u = np.genfromtxt(csv_file, dtype=alttype, delimiter=',')
производства
array([('ZINC00043096', 'C.3', 'C1', -0.154, 'methyl'),
('ZINC00043096', 'C.3', 'C2', 0.0638, 'methylene'),
('ZINC00043096', 'C.3', 'C4', 0.0669, 'methylene'),
('ZINC00090377', 'C.3', 'C7', 0.207, 'methylene')],
dtype=[('f0', '<U12'), ('f1', '<U3'), ('f2', '<U2'), ('f3', '<f8'), ('f4', '<U9')])
В Вместо Python2.7 all_data_u
отображается как
(u'ZINC00043096', u'C.3', u'C1', -0.154, u'methyl')
all_data_u
составляет 448 байт, потому что numpy
выделяет 4 байта для каждого символа Unicode. Каждый U4
элемент имеет длину 16 байт.
изменения в v 1.14: https://docs.scipy.org/doc/numpy/release.html#encoding-argument-for-text-io-functions
np.genfromtxt(csv_file, dtype='|S12', delimiter=',')
или вы можете выбрать столбцы, которые вы знаете, строки с помощью
в python 3.6,
all_data = np.genfromtxt(csv_file.csv, delimiter=',', dtype='unicode')
работает просто отлично.