【问题标题】:python flatten an array of arraypython展平一个数组
【发布时间】:2019-11-17 13:20:46
【问题描述】:

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

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 或 list,它们不适用于数组。

    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),...

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

【问题讨论】:

  • 这里的array 是什么意思?看起来您确实有一个 numpy 数组数组。如果是这样,为什么没有[numpy] 标签?有一个内置的array 模块,但我认为不支持这种结构。
  • 换一种方式来提问,imports你做了什么模块?

标签: python arrays data-manipulation flatten


【解决方案1】:

使用列表推导,然后转换回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])
>>> 

【讨论】:

    【解决方案2】:
    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 加入一个数组列表(或可迭代)。

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 2014-08-29
      • 2014-08-19
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多