代码之家  ›  专栏  ›  技术社区  ›  conv3d

通过准备NaN使所有子列表的长度相同

  •  0
  • conv3d  · 技术社区  · 6 年前

    如何通过在每个子列表上预先设置np.nan,使所有子列表的长度(最长子列表的长度)相同?

    import random
    [list(range(0,random.randint(1,5))) for x in range(n)]
    

    因此,如果输出是:

    [0,1],[0],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3]]

    它应该看起来像:

    [南,南,南,0,1],[南,南,南,南,0],[0,1,2,3,4],[0,1,2, 3,4],[南,0,1,2,3]]

    4 回复  |  直到 6 年前
        1
  •  3
  •   kindall    6 年前

    首先,使用 max() . 然后,对于每个子列表,使用一个切片分配将该列表的内容替换为正确的 NaN 然后是原始列表。

    import random, math
    
    n = 5
    lists = [list(range(0,random.randint(1,5))) for x in range(n)]
    
    # get the maximum length
    maxlen = len(max(lists, key=len))
    
    # pad left of each sublist with NaN to make it as long as the longest
    for sublist in lists:
        sublist[:] = [math.nan] * (maxlen - len(sublist)) + sublist
    
        2
  •  3
  •   Torin M.    6 年前
    import random
    import numpy as np
    
    n = 5
    a = [list(range(0,random.randint(1,5))) for x in range(n)]
    for c in a:
        while len(c) < n:
            c.insert(0, np.nan)
    print(a)
    

    [南,南,南,南,0],[南,南,南,南,0],[南,南,0,1],[南,南,0,1,2],[南,南,南,0,1]]

    这是我认为你正在寻找的一个例子。

        3
  •  0
  •   ritratt    6 年前

    这不是最常见的蟒蛇密码,但我认为它可以做到:

    longest_list_length = 0
    for sublist in output:
      if len(sublist) > longest_list_length:
        longest_list_length = len(sublist)
    
    for sublist in output:
      nans_to_prepend = ['nan'] * (longest_list_length - len(sublist))
      sublist = nans_to_prepend + sublist
    
        4
  •  0
  •   r.ook    6 年前

    如果你只关心生成 np.nan 在随机创建期间填充,这个简单的一行程序就足够了:

    [[np.nan]*(5-j) + list(range(j)) for j in (random.randint(1, 5) for x in range(5))]
    
    # [[nan, 0, 1, 2, 3], 
    #  [nan, nan, 0, 1, 2], 
    #  [nan, nan, nan, 0, 1], 
    #  [nan, 0, 1, 2, 3],
    #  [0, 1, 2, 3, 4]]
    

    你当然可以换 5 具有 n 确定你的最大长度。