【问题标题】:how to set all inner values of 2d numpy array to the same size with default fill values如何使用默认填充值将 2d numpy 数组的所有内部值设置为相同的大小
【发布时间】:2020-06-18 05:24:10
【问题描述】:

我有一个 NumPy 数组,其中包含许多不同大小的子数组。我希望所有子数组的大小相同。我不想删除任何信息,所以我想用默认值填充数组。

转换这个:

[array([ 1. , 15.5]) array([1.]) array([ 1. , 15.5]) array([1.])
 array([ 1. , 15.5]) array([1.]) array([ 1. , 15.5]) array([1.])
 array([1.]) array([1.]) array([ 1. , 15.5]) array([1.])
 array([ 1. , 15.5, 92. ]) array([1.]) array([ 1. , 15.5]) array([1.])
 array([ 1. , 15.5]) array([1.]) array([ 1. , 15.5]) array([1.])
 array([ 1. , 15.5]) array([1.]) array([1.]) array([1.])]

进入这个:

[[1., 15.5, 0],   [1., 0, 0], [1., 15.5, 0],  [1., 0, 0],
 [1., 15.5, 0],   [1., 0, 0], [1., 15.5, 0],  [1., 0, 0],
 [1., 0, 0],      [1., 0, 0], [1., 15.5, 0],  [1., 0, 0],
 [1., 15.5, 92.], [1., 0, 0], [1., 15.5, 0],  [1., 0, 0],
 [1., 15.5, 0],   [1., 0, 0], [1., 15.5, 0],  [1., 0, 0],
 [1., 15.5, 0],   [1., 0, 0], [1., 0, 0],     [1., 0, 0]]

我在上面的例子中使用了 0 作为我的默认值。

【问题讨论】:

    标签: python python-3.x numpy multidimensional-array


    【解决方案1】:

    找到数组的最大大小并使用内置的 pad 函数将它们全部填充到最大大小(您甚至可以传递您选择的值来填充该函数中的填充 - 默认值为 0):

    l_m = max([i.size for i in a])
    padded = np.stack([np.pad(i,(0,l_m-len(i)),'constant') for i in a])
    

    输出:

    [[ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.   0.   0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5 92. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.  15.5  0. ]
     [ 1.   0.   0. ]
     [ 1.   0.   0. ]
     [ 1.   0.   0. ]]
    

    【讨论】:

      【解决方案2】:

      这是使用itertools.zip_longest的快速方法

      np.array([*it.zip_longest(*map(np.ndarray.tolist,a),fillvalue=0)]).T
      array([[ 1. , 15.5,  0. ],
             [ 1. ,  0. ,  0. ],
                 < -- snip -- > 
             [ 1. ,  0. ,  0. ],
             [ 1. , 15.5, 92. ],
             [ 1. ,  0. ,  0. ],
                 < -- snip -- > 
             [ 1. ,  0. ,  0. ],
             [ 1. ,  0. ,  0. ]])
      

      我们可以牺牲一点速度并简化:

      np.transpose([*it.zip_longest(*a,fillvalue=0)])
      

      这仍然比np.pad 方法快得多:

      timeit(lambda:np.array([*it.zip_longest(*map(np.ndarray.tolist,a),fillvalue=0)]).T,number=10000)
      0.12874844600446522
      >>> timeit(lambda:np.transpose([*it.zip_longest(*a,fillvalue=0)]),number=10000)
      0.29307466209866107
      >>> timeit(lambda:np.stack([np.pad(i,(0,l_m-len(i)),'constant') for i in a]),number=10000)
      6.289798409212381
      

      变体

      如果结果必须是 C 连续的:

      np.array([*it.zip_longest(*map(np.ndarray.tolist,a),fillvalue=0)],order="F").T
      

      如果它必须拥有自己的数据:

      np.array([*zip(*it.zip_longest(*a,fillvalue=0))])
      

      【讨论】:

        猜你喜欢
        • 2018-08-29
        • 2016-06-28
        • 1970-01-01
        • 2020-12-08
        • 2011-08-18
        • 1970-01-01
        • 2017-08-01
        • 2020-11-05
        • 2019-08-17
        相关资源
        最近更新 更多