【问题标题】:Dict with list of values convert to np.array object with dtype=int32带有值列表的字典转换为 dtype=int32 的 np.array 对象
【发布时间】:2017-06-23 10:52:10
【问题描述】:

我有一本字典{0: [], 1: [], ...}。每个列表的长度都不同。
如何将这样的字典转换为np.array 对象?
我想得到这样的结构:array([[],[],..., dtype=int32)

【问题讨论】:

    标签: python arrays list numpy dictionary


    【解决方案1】:

    奇怪的是,将 dict 放入 numpy 数组是可行的。也可以将列出的值放入数组中。

    import numpy as np
    
    d = {0: [1, 2], 1: [3, 6, 7]}
    arr = np.array(d)
    print(arr)
    li = d.values()
    print(li)
    arr2 = np.array(li)
    print(arr2)
    

    【讨论】:

    • 但这不会产生int32 数组。
    【解决方案2】:

    你试过这个吗?

    np.array(list(d.values()))
    

    输出

    array([], shape=(2, 0), dtype=float64)
    

    【讨论】:

    • 是的,但它给了我 array(dict_values([[], [], []...]))。
    【解决方案3】:

    如果列表的长度不同,您可以使用 np.ma.MaskedArray:

    import numpy as np
    
    maxlen = max(len(lst) for lst in d.values())   # maximum length of all value-lists
    
    arr = np.ma.MaskedArray(np.zeros((len(d), maxlen), dtype='int32'), 
                            mask=True, 
                            dtype='int32')
    
    for line, lst in d.items():
        arr[line, :len(lst)] = lst
    
    # In case the "keys" of your dictionary don't represent the "rows" you need to
    # use another (more robust) approach:
    # for idx, (line, lst) in enumerate(sorted(d.items())):
    #     arr[idx, :len(lst)] = lst
    

    例如:

    d = {0: [], 1: [1], 2: [1, 2]}
    

    像这样给出arr

    masked_array(data =
     [[-- --]
     [1 --]
     [1 2]],
                 mask =
     [[ True  True]
     [False  True]
     [False False]],
           fill_value = 999999)
    

    这与拥有空列表不同,但 NumPy 不支持不规则数组,因此MaskedArray 是“模拟”它们的可能方法之一。在大多数情况下,它们的行为就像一个“参差不齐的数组”。 :)

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2021-12-09
      • 2021-06-28
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多