【问题标题】:NumPy array from list of lists with different length (padding) [duplicate]来自具有不同长度(填充)列表列表的 NumPy 数组 [重复]
【发布时间】:2020-12-31 21:48:06
【问题描述】:

我有一个这样的列表:

lista=[[1,2,3],
       [1,2,3,4,5,6],
       [1,2],]

我想得到这样的 numpy.array,(较短的列表元素扩展为最大长度,然后将尾部值设置为零):

array([[1,2,3,0,0,0],
       [1,2,3,4,5,6],
       [1,2,0,0,0,0],])

怎么办? numpy中有哪些内置方法?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如何创建一个 zeros numpy 数组,然后相应地填充值?

    lists = [[1,2,3],
           [1,2,3,4,5,6],
           [1,2]]
    
    a = np.zeros([len(lists), max([len(x) for x in lists])])
    
    for i, sub in enumerate(lists):
        a[i][0:len(sub)] = sub
    

    【讨论】:

      【解决方案2】:

      没有直接使用 numpy 的方法,因为每个内部列表都有不同数量的元素。一种方法是使用itertools.zip_longestfillvalue

      from itertools import zip_longest
      
      np.array(list(zip_longest(*lista, fillvalue=0))).T
      array([[1, 2, 3, 0, 0, 0],
             [1, 2, 3, 4, 5, 6],
             [1, 2, 0, 0, 0, 0]])
      

      【讨论】:

      • 更多详情请参见stackoverflow.com/questions/38619143/… 中的讨论。当列表大小变化很大时,上述方法可以很好地扩展,而布尔索引适用于大量元素。
      • 也可以使用np.fromiter 对其进行优化(大型列表为 25%)。 np.array(list(<iterator>)) 通常不是最快的选择。
      • 是的@mathfux 试了一下,但如果我没记错的话,np.fromiter 想要一个结构化的。直接为值指定单个 dtype 会产生错误
      • @yatu 我是这样做的:dt = np.dtype([('', np.int)]*M) #or np.dtype(','.join('i'*M)); indices = np.fromiter(zip_longest(*lists, fillvalue=0), dt); indices = indices.view(np.int).reshape(-1, M).T 其中M 是行的长度(查看 Robo 的答案)。
      • 对 milt 改进稍微复杂一些。但是很高兴知道另一种选择,谢谢@mathfux :)
      猜你喜欢
      • 2017-08-26
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2018-08-14
      • 2017-10-12
      • 2018-09-28
      相关资源
      最近更新 更多