python 展平数组数组

python flatten an array of array

我有一个数组数组,类似这样的东西:

array([[array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
      dtype=int64)],
       [array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
      dtype=int64)],
       [array([46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285,
       17616, 25146, 32645, 41276], dtype=int64)],
       ...,
       [array([24534,  8230, 14267,  9352,  3543, 29397,   900, 32398, 34262,
       37646, 11930, 37173], dtype=int64)],
       [array([25157], dtype=int64)],
       [array([ 8859, 20850, 19322,  8075], dtype=int64)]], dtype=object)

我想要的是

     array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668,33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665,46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285,17616, 25146, 32645, 41276
               ...,
24534,  8230, 14267,  9352,  3543, 29397,   900, 32398, 34262,
               37646, 11930, 37173,25157 8859, 20850, 19322,  8075, dtype=object)

我为此搜索了一些解决方案,但似乎所有这些都是针对 np.array 或列表的,不适用于数组。

    functools.reduce(operator.iconcat, orders2.values.tolist(), [])
[array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
       dtype=int64),
 array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
       dtype=int64),
 array([46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285,
        17616, 25146, 32645, 41276], dtype=int64),...
    orders2.values.flatten()
array([array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
      dtype=int64),
       array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
      dtype=int64),

我什至无法将数组转换为列表

[sub.tolist() for sub in orders2.values]
    [array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
           dtype=int64),
     array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
           dtype=int64),
     array([46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285,
            17616, 25146, 32645, 41276], dtype=int64),...
        orders2.values.flatten()
    array([array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
          dtype=int64),
           array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
          dtype=int64),...

我发现很难获得关于数组 class 的一些信息,一切都是列表或 np.array

使用列表理解,然后转换回 array:

>>> arr = array([[array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668],
      dtype='int64')],
       [array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665],
      dtype='int64')],
       [array([46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285,
       17616, 25146, 32645, 41276], dtype='int64')],
       [array([24534,  8230, 14267,  9352,  3543, 29397,   900, 32398, 34262,
       37646, 11930, 37173], dtype='int64')],
       [array([25157], dtype='int64')],
       [array([ 8859, 20850, 19322,  8075], dtype='int64')]], dtype=object)
>>> array([x for i in arr.tolist() for x in i[0].tolist()])
array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668,
       33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665, 46842,
       26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285, 17616,
       25146, 32645, 41276, 24534,  8230, 14267,  9352,  3543, 29397,
         900, 32398, 34262, 37646, 11930, 37173, 25157,  8859, 20850,
       19322,  8075])
>>> 
In [141]: array=np.array; 
     ...: arr = array([[array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668], 
     ...:       dtype='int64')], 
     ...:        [array([33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665], 
     ...:       dtype='int64')], 
     ...:        [array([46842, 26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285, 
     ...:        17616, 25146, 32645, 41276], dtype='int64')], 
     ...:        [array([24534,  8230, 14267,  9352,  3543, 29397,   900, 32398, 34262, 
     ...:        37646, 11930, 37173], dtype='int64')], 
     ...:        [array([25157], dtype='int64')], 
     ...:        [array([ 8859, 20850, 19322,  8075], dtype='int64')]], dtype=object)                           
In [142]: np.concatenate(arr.ravel())                                                                           
Out[142]: 
array([33120, 28985,  9327, 45918, 30035, 17794, 40141,  1819, 43668,
       33754, 24838, 17704, 21903, 17668, 46667, 17461, 32665, 46842,
       26434, 39758, 27761, 10054, 21351, 22598, 34862, 40285, 17616,
       25146, 32645, 41276, 24534,  8230, 14267,  9352,  3543, 29397,
         900, 32398, 34262, 37646, 11930, 37173, 25157,  8859, 20850,
       19322,  8075])

形状是二维的:

In [143]: arr.shape                                                                                             
Out[143]: (6, 1)

arr.ravel() 使其成为 1d (6,),np.concatenate 加入数组列表(或可迭代的)。