【问题标题】:Creating a dictionary from text file Python Numpy从文本文件 Python Numpy 创建字典
【发布时间】:2017-07-07 17:23:53
【问题描述】:

我有一个如下所示的文本文件:

# 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。

【问题讨论】:

    标签: python numpy dictionary text-files


    【解决方案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 来创建描述列的复合 dtype,请务必使用模板字符串,只要您期望的最长

      • 可能有一种创建复合 dtypes 的官方方法不涉及创建一次性数组,但这很简单且有效
    • loadtxt 参数是不言自明的,因为复合 dtype 它会生成一维记录数组
    • 如果没有重复的键,我们可以使用字典推导将记录数组转换为字典 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)]}
    

    【讨论】:

    • 非常感谢保罗。我永远不会很快找到这个解决方案!
    • 不客气。我知道这有一些完全不明显的步骤。只能通过反复试验找到它。
    • 您能否更新您的问题并将这样的行添加到您的示例文件中?那我去查一下。
    • 当最后一列包含像ABC-5D这样的字符串名称时会出现问题。最后一列的名称可以是不同长度的字母、数字和符号的组合。
    • 已排序。但是重复键可能存在问题。让我知道您希望如何处理它们。
    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 2013-07-13
    • 2012-04-10
    • 2018-03-29
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多