【问题标题】:correct and efficient way to flatten array in numpy in python? [duplicate]在python中用numpy展平数组的正确有效方法? [复制]
【发布时间】:2012-02-21 20:44:01
【问题描述】:

我有:

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

我想将其展平,将两个内部列表连接到一个平面数组条目中。我能做到:

array(list(flatten(a)))

但由于列表转换,这似乎效率低下(我想以数组而不是生成器结束。)

另外,如何将其推广到这样的数组:

b = array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])

结果应该在哪里:

b = array([[1,2,3,4,5,6],
           [10,11,12,13,14,15]])

是否有内置/高效的 numpy/scipy 操作符?谢谢。

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    您可能需要查看 numpy.flattennumpy.ravel,它们都从 n 维数组返回一维数组。

    此外,如果您不打算修改返回的一维数组,我建议您使用numpy.ravel,因为它不会复制数组,而只是返回数组的视图,即比numpy.flatten快很多。

    >>>a = np.arange(10000).reshape((100,100))
    
    >>>%timeit a.flatten()
    100000 loops, best of 3: 4.02 µs per loop
    
    >>>%timeit a.ravel()
    1000000 loops, best of 3: 412 ns per loop
    

    还可以查看post

    【讨论】:

    • 我必须查一下:micro = 10^-6, nano=10^-9
    • 视图并不总是更好,如果你不小心记住它是一个视图,它可能会导致错误 - 只有在有意义的情况下才这样做。
    【解决方案2】:

    您可以使用reshape method

    >>> import numpy
    >>> b = numpy.array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])
    >>> b.reshape([2, 6])
    array([[ 1,  2,  3,  4,  5,  6],
           [10, 11, 12, 13, 14, 15]])
    

    【讨论】:

    • 我觉得应该是a.reshape([2,6]),谢谢!
    • @user248237:呃,对不起,我看错了你的问题,仍然是你必须使用的方法。现在修好了。 :)
    • reshape() 是个好方法。
    • 如果你像我一样懒惰,你可以这样做b.reshape([2, -1])
    【解决方案3】:

    怎么样:

    >>> import numpy as np
    >>> a=np.arange(1,7).reshape((2,3))
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> a.flatten()
    array([1, 2, 3, 4, 5, 6])
    

    >>> import numpy as np
    >>> b=np.arange(1,13).reshape((2,2,3))
    >>> b
    array([[[ 1,  2,  3],
            [ 4,  5,  6]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    >>> b.reshape((2,6))
    array([[ 1,  2,  3,  4,  5,  6],
           [ 7,  8,  9, 10, 11, 12]])
    

    【讨论】:

    • +1 for flatten() -- 它也可以进行 Fortran/column-major 展平。 reshape(-1) 也会变平。
    【解决方案4】:
    a = np.arange(10000)
    
    %timeit a.reshape(100,100)
    1000000 loops, best of 3: 517 ns per loop
    
    %timeit a.resize(100,100)
    1000000 loops, best of 3: 428 ns per loop
    

    我想知道重塑应该花费更少的时间,但它几乎相似

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2020-04-27
      • 2013-06-12
      • 2017-09-28
      • 1970-01-01
      相关资源
      最近更新 更多