如何将文件加载到key:text,val:numpy浮点数组所在的字典中



我想要使用的文件格式如下;

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

最新更新