我想将标准的ascii csv文件读入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 转换的真正工作原理......如果你能在这里给我一些提示,那就太好了!
谢谢
在python 3.6中,
all_data = np.genfromtxt('csv_file.csv', delimiter=',', dtype='unicode')
工作得很好。
在 Python 2.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]
.
变量/未知长度字符串/numpy 中的统一码 dtype提醒我可以在dtype
中指定 Unicode 字符串类型。 但是,如果您事先不知道字符串的长度,这会变得更加复杂。
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
为每个 unicode 字符分配 4 个字节。 每个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=',')
或者,您可以使用 usecols
参数选择已知是字符串的列:
np.genfromtxt(csv_file, dtype=None, delimiter=',',usecols=(0,1,2,4))