Flattening a list of NumPy arrays?

前端 未结 5 1590
别那么骄傲
别那么骄傲 2020-12-01 06:13

It appears that I have data in the format of a list of NumPy arrays (type() = np.ndarray):

[array([[ 0.00353654]]), array([[ 0.00353654]]), arra         


        
5条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-01 06:42

    Can also be done by

    np.array(list_of_arrays).flatten().tolist()
    

    resulting in

    [0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654]
    

    Update

    As @aydow points out in the comments, using numpy.ndarray.ravel can be faster if one doesn't care about getting a copy or a view

    np.array(list_of_arrays).ravel()
    

    Although, according to docs

    When a view is desired in as many cases as possible, arr.reshape(-1) may be preferable.

    In other words

    np.array(list_of_arrays).reshape(-1)
    

    The initial suggestion of mine was to use numpy.ndarray.flatten that returns a copy every time which affects performance.

    Let's now see how the time complexity of the above-listed solutions compares using perfplot package for a setup similar to the one of the OP

    import perfplot
    
    perfplot.show(
        setup=lambda n: np.random.rand(n, 2),
        kernels=[lambda a: a.ravel(),
                 lambda a: a.flatten(),
                 lambda a: a.reshape(-1)],
        labels=['ravel', 'flatten', 'reshape'],
        n_range=[2**k for k in range(16)],
        xlabel='N')
    

    Here flatten demonstrates piecewise linear complexity which can be reasonably explained by it making a copy of the initial array compare to constant complexities of ravel and reshape that return a view.

    It's also worth noting that, quite predictably, converting the outputs .tolist() evens out the performance of all three to equally linear.

提交回复
热议问题