【问题标题】:How to make a numpy array from an array of arrays?如何从数组数组中创建一个 numpy 数组?
【发布时间】:2017-03-17 02:23:07
【问题描述】:

我正在ipython3 中进行实验,在那里我创建了一个数组数组:

In [105]: counts_array
Out[105]: 
array([array([ 17,  59, 320, ...,   1,   7,   0], dtype=uint32),
       array([ 30,  71, 390, ...,  12,  20,   6], dtype=uint32),
       array([  7, 145, 214, ...,   4,  12,   0], dtype=uint32),
       array([ 23, 346, 381, ...,  15,  19,   5], dtype=uint32),
       array([ 51,  78, 270, ...,   3,   0,   2], dtype=uint32),
       array([212, 149, 511, ...,  19,  31,   8], dtype=uint32)], dtype=object)

In [106]: counts_array.shape
Out[106]: (6,)

In [107]: counts_array[0].shape
Out[107]: (1590,)

我想从我创建的这个怪物中获取一个普通的shape=(6, 1590), dtype=uint32 数组。

我该怎么做?

【问题讨论】:

    标签: python arrays numpy reshape dimensions


    【解决方案1】:

    你可以使用np.vstack -

    np.vstack(counts_array)
    

    np.concatenate 的另一种方式-

    np.concatenate(counts_array).reshape(len(counts_array),-1)
    

    示例运行 -

    In [23]: a
    Out[23]: 
    array([array([68, 92, 84, 35, 14, 71, 55, 40, 21, 41]),
           array([30, 90, 52, 64, 86, 68, 61, 85, 26, 98]),
           array([98, 64, 23, 49, 13, 17, 52, 96, 97, 19]),
           array([54, 26, 25, 22, 95, 77, 20, 73, 22, 80]),
           array([15, 84, 91, 54, 25, 21, 37, 19, 25, 25]),
           array([87, 17, 49, 74, 11, 34, 27, 23, 22, 83])], dtype=object)
    
    In [24]: np.vstack(a)
    Out[24]: 
    array([[68, 92, 84, 35, 14, 71, 55, 40, 21, 41],
           [30, 90, 52, 64, 86, 68, 61, 85, 26, 98],
           [98, 64, 23, 49, 13, 17, 52, 96, 97, 19],
           [54, 26, 25, 22, 95, 77, 20, 73, 22, 80],
           [15, 84, 91, 54, 25, 21, 37, 19, 25, 25],
           [87, 17, 49, 74, 11, 34, 27, 23, 22, 83]])
    

    【讨论】:

    • 谢谢。根据 ipython 中的%timeit,根据我的数据,您的concatenate 方式是我的array 方式的两倍。 vstack 方式慢了 4 .5 倍以上。
    • @bli 太棒了!很高兴在那里看到一些运行时数字!对此并不感到惊讶,因为vstack 会在内部使用concatenate。
    • 而vstack 必须先将每个数组重新整形为 2d。
    • @hpaulj 这对于时间安排是有道理的,谢谢!
    【解决方案2】:

    经过各种实验,结果证明下面的简单语法是可行的:

    numpy.array([sub_array for sub_array in counts_array])
    

    我的第一个工作版本不必要的复杂:

    numpy.array([[*sub_array] for sub_array in counts_array], dtype=numpy.uint32)
    

    【讨论】:

      【解决方案3】:

      你考虑过numpy.vstack()吗? 我经常将它用于此类操作。

      【讨论】:

        猜你喜欢
        • 2017-12-30
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2017-12-27
        • 2023-01-25
        相关资源
        最近更新 更多