NumPy dtype проблемы в genfromtxt (), читает строку в виде bytestring


5 принят

В Python2.7

all_data

в Python3

b'C.3'

«Обычные» строки в Python3 являются unicode. Но ваш текстовый файл имеет байтовые строки. 'ZIN' in all_data['f0'][1]одинаково в обоих случаях (136 байт), но способ отображения строки байтов Python3 - это b'ZIN' in all_data['f0'][1]не просто «C.3».

Какие операции вы планируете выполнять с этими строками? dtypeработает с версией 2.7, но в 3 вам нужно использовать alttype = np.dtype([('f0', 'U12'), ('f1', 'U3'), ('f2', 'U2'), ('f3', '<f8'), ('f4', 'U9')]) all_data_u = np.genfromtxt(csv_file, dtype=alttype, delimiter=',') .

Строка переменной / неизвестной длины / unicode dtype в numpy напоминает мне, что вы можете указать тип строки юникода в dtype. Однако это становится более сложным, если вы заранее не знаете длины строк.

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')])

производства

all_data_u

В Python2.7 (u'ZINC00043096', u'C.3', u'C1', -0.154, u'methyl') отображается как

all_data_u

numpyсоставляет 448 байт, поскольку numpyвыделяет 4 байта для каждого символа юникода. Каждый U4элемент имеет длину 16 байтов.


Изменения в версии 1.14: https://docs.scipy.org/doc/numpy/release.html#encoding-argument-for-text-io-functions


4
np.genfromtxt(csv_file, dtype='|S12', delimiter=',')

Или вы можете выбрать столбцы, которые, как вам известно, являются строками, используя usecolsпараметр:

np.genfromtxt(csv_file, dtype=None, delimiter=',',usecols=(0,1,2,4))

1

В python 3.6,

all_data = np.genfromtxt(csv_file.csv, delimiter=',', dtype='unicode')

работает просто отлично.

питон, NumPy, genfromtxt,

python,numpy,genfromtxt,

10

Ответов: 3


5 принят

В Python2.7

all_data

в Python3

b'C.3'

«Обычные» строки в Python3 являются unicode. Но ваш текстовый файл имеет байтовые строки. 'ZIN' in all_data['f0'][1]одинаково в обоих случаях (136 байт), но способ отображения строки байтов Python3 - это b'ZIN' in all_data['f0'][1]не просто «C.3».

Какие операции вы планируете выполнять с этими строками? dtypeработает с версией 2.7, но в 3 вам нужно использовать alttype = np.dtype([('f0', 'U12'), ('f1', 'U3'), ('f2', 'U2'), ('f3', '<f8'), ('f4', 'U9')]) all_data_u = np.genfromtxt(csv_file, dtype=alttype, delimiter=',') .

Строка переменной / неизвестной длины / unicode dtype в numpy напоминает мне, что вы можете указать тип строки юникода в dtype. Однако это становится более сложным, если вы заранее не знаете длины строк.

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')])

производства

all_data_u

В Python2.7 (u'ZINC00043096', u'C.3', u'C1', -0.154, u'methyl') отображается как

all_data_u

numpyсоставляет 448 байт, поскольку numpyвыделяет 4 байта для каждого символа юникода. Каждый U4элемент имеет длину 16 байтов.


Изменения в версии 1.14: https://docs.scipy.org/doc/numpy/release.html#encoding-argument-for-text-io-functions


4
np.genfromtxt(csv_file, dtype='|S12', delimiter=',')

Или вы можете выбрать столбцы, которые, как вам известно, являются строками, используя usecolsпараметр:

np.genfromtxt(csv_file, dtype=None, delimiter=',',usecols=(0,1,2,4))

1

В python 3.6,

all_data = np.genfromtxt(csv_file.csv, delimiter=',', dtype='unicode')

работает просто отлично.

питон, NumPy, genfromtxt,
Похожие вопросы