我有一个看起来像这样的文本文件:
# Comments
PARAMETER 0 0
1045 54
1705 0 time 1
1 10 100 0.000e+00 9999 A
2 20 200 0.2717072 9999 B
3 30 300 0.0282928 9999 C
1 174 92 2999.4514 9999 APEW-1
2 174 92 54.952499 9999 ART-3A
1 174 97 5352.1299 9999 APEW-2
1 173 128 40.455467 9999 APEW-3
2 173 128 1291.1320 9999 APEW-3
3 173 128 86.562599 9999 ART-7B
...
我想创建一个如下所示的字典(基本上跳过标题和某些列并转到我需要的数据):
my_dict = {'A':(1,10,100),'B':(2,20,200), 'C':(3,30,300), 'APEW-1':(1,174,92), ...}
这些数据点是观察点,它们各自的值是深度,y,x。因此,一个观察点可以具有不同深度的多个值(第一列)。我试图通过为重复项添加后缀来避免重命名标签。我想知道它是否有任何解决方法。我想用它们做的是调用观察点名称并提取坐标。我不确定字典是否是用于此目的的正确工具。 它是一个小型数据集,并不需要快速。我正在使用Numpy,Python 2.7。
答案 0 :(得分:1)
loadtxt
可以做到:
>>> dtype=np.rec.fromrecords([[0, 0, 0, b'APEW-1']]).dtype
>>> x = np.loadtxt(fn, skiprows=4, usecols=(0,1,2,5), dtype=dtype)
>>>
>>> result = {}
>>> for x0, x1, x2, key in x:
... try:
... result[key.decode()].append((x0,x1,x2))
... except KeyError:
... result[key.decode()] = [(x0,x1,x2)]
...
>>> result
{'A': [(1, 10, 100)], 'B': [(2, 20, 200)], 'C': [(3, 30, 300)], 'APEW-1': [(1, 174, 92)], 'ART-3A': [(2, 174, 92)], 'APEW-2': [(1, 174, 97)], 'APEW-3': [(1, 173, 128), (2, 173, 128)], 'ART-7B': [(3, 173, 128)]}
注意:
我们滥用rec.fromrecords
来创建描述列的compund dtype,确保使用模板字符串,只要您期望的最长
dtypes
的官方方法,它不涉及创建一个丢弃数组但这很容易并且有效loadtxt
参数是不言自明的,因为复合dtype它会生成1d记录数组如果没有重复的密钥,我们可以使用dict comprehension将记录数组转换为dict f0-f3
是自动生成的字段名称
py2版本:主要区别不需要使用字节字符串/ decode
,字典忘记了项目的顺序
>> dtype=np.rec.fromrecords([[0, 0, 0, 'APEW-1']]).dtype
>>> x = np.loadtxt(fn, skiprows=4, usecols=(0,1,2,5), dtype=dtype)
>>>
>>> result = {}
>>> for x0, x1, x2, key in x:
... try:
... result[key].append((x0,x1,x2))
... except KeyError:
... result[key] = [(x0,x1,x2)]
...
>>> result
{'A': [(1, 10, 100)], 'B': [(2, 20, 200)], 'C': [(3, 30, 300)], 'APEW-1': [(1, 174, 92)], 'ART-3A': [(2, 174, 92)], 'APEW-2': [(1, 174, 97)], 'APEW-3': [(1, 173, 128), (2, 173, 128)], 'ART-7B': [(3, 173, 128)]}