我想要使用的文件格式如下;
a, 1.1, 2.2, 3.3, 4.4
b, 5.5, 6.6, 7.7, 8.8
c, 9.9, ..., ..., ...
我需要通过第一列将其转换为字典Keys,相关值为4位数字的numpy数组。这是在python 3上运行的。
到目前为止,我已经尝试使用line.split
将它们分离为两个数据集,但我不确定从这里开始该怎么做,也不确定这是否正确:
d = {}
with open("filex.csv") as f:
for line in f:
(key, val) = line.split(",", 1)
这是最简单的方法:
import numpy as np
d = {}
with open("filex.csv") as f:
for line in f:
splits = line.split(",")
key = splits[0]
d[key] = np.array([s.strip() for s in splits[1:]])
我们可以通过以下几种方式加载带有genfromtxt
的文件:
In [10]: txt = """a, 1.1, 2.2, 3.3, 4.4
...: b, 5.5, 6.6, 7.7, 8.8""".splitlines()
In [11]: data = np.genfromtxt(txt, delimiter=',', dtype=None, encoding=None)
In [12]: data
Out[12]:
array([('a', 1.1, 2.2, 3.3, 4.4), ('b', 5.5, 6.6, 7.7, 8.8)],
dtype=[('f0', '<U1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')])
In [13]: data['f0']
Out[13]: array(['a', 'b'], dtype='<U1')
In [14]: data['f1']
Out[14]: array([1.1, 5.5])
这会将每一列放在一个单独的字段中。
但出于您的目的,我们可以使用4列字段来细化数据类型:
In [15]: data = np.genfromtxt(txt, delimiter=',', dtype=[('key','U2'),('data',float,4)], encoding=None)
In [16]: data
Out[16]:
array([('a', [1.1, 2.2, 3.3, 4.4]), ('b', [5.5, 6.6, 7.7, 8.8])],
dtype=[('key', '<U2'), ('data', '<f8', (4,))])
In [17]: data['key']
Out[17]: array(['a', 'b'], dtype='<U2')
In [18]: data['data']
Out[18]:
array([[1.1, 2.2, 3.3, 4.4],
[5.5, 6.6, 7.7, 8.8]])
从那里到字典很容易:
In [19]: dd = {k:d for k,d in zip(data['key'], data['data'])}
In [20]: dd
Out[20]: {'a': array([1.1, 2.2, 3.3, 4.4]), 'b': array([5.5, 6.6, 7.7, 8.8])}