【问题标题】:How to flatten an object array in numpy?如何在numpy中展平对象数组?
【发布时间】:2019-07-05 10:56:26
【问题描述】:

我有一个数组

np.array([[[ 1,  2], [ 3, -4]],[[-1,  0]]], dtype=object)

我想把它展平以获得类似的东西:

array([1,2,3,-4,-1,0], dtype=int32)

我尝试了Flatten numpy array,但它引发了一个值错误

需要明确的是,我的数组始终是一个对象数组,由多个 2D 和 1D 数组组成

【问题讨论】:

  • 你有一个数组,这真的是你想要的吗?
  • @NilsWerner 是的
  • 什么形状?如果是 1d,请尝试 hstack
  • @hpaulj 是一个由一维数组和二维数组组成的对象数组
  • 在较新的版本中,打印显示哪些元素是数组,例如。 np.array([np.array([1,2,3]), ...]) 您的打印内容模棱两可,但我猜 (2,) 包含 (2,2) 和 (1,2)。如果是这样,那么vstack 应该是 (3,2)。

标签: python numpy


【解决方案1】:
In [333]: arr = np.array([[[ 1,  2], [ 3, -4]],[[-1,  0]]], dtype=object)                                       
In [334]: arr                                                                                                   
Out[334]: array([list([[1, 2], [3, -4]]), list([[-1, 0]])], dtype=object)
In [335]: arr.shape                                                                                             
Out[335]: (2,)
In [336]: np.vstack(arr)                                                                                        
Out[336]: 
array([[ 1,  2],
       [ 3, -4],
       [-1,  0]])
In [337]: np.vstack(arr).ravel()                                                                                
Out[337]: array([ 1,  2,  3, -4, -1,  0])

【讨论】:

    【解决方案2】:

    如果你不知道你的嵌套数组的深度,你可以这样做:

    l = np.array([[[ 1,  2],[ 3, -4]], [-1,  0]])
    
    from collections.abc import Iterable
    
    def flatten(l):
        returnlist=[]
        for elem in l:
            if isinstance(elem, Iterable):
                returnlist.extend(flatten(elem))
            else:
                returnlist.append(elem)
    
        return returnlist
    
    np.array(flatten(l))
    

    如果它是 2 维的,你可以像那个帖子那样建议 How to make a flat list out of list of lists

    flat_list = [item for sublist in l for item in sublist]
    

    或者只使用 numpys flatten。

    顺便说一句,由于那些双括号,您的示例不是二维的,这也是 flatten() 不起作用的原因:

    np.array([[[ 1, 2], [ 3, -4 ]],[[-1, 0]]], dtype=object)

    【讨论】:

    • 有没有更简单/更快的方法?
    • 从更好的数据开始会更容易。你在这里混合了一个 numpy 数组和列表。但要回答这个问题:可能有,但目前我知道没有更快的方法,即使它可能存在。
    【解决方案3】:

    它是嵌套的,但您可以使用sum() 来执行此操作:

    nested_list_values = [[[ 1,  2], [ 3, -4]],[[-1,  0]]]
    sum(sum(, []), [])
    

    [1, 2, 3, -4, -1, 0]

    或者,如果感觉更自然,请使用itertools.chain()

    from itertools import chain
    
    nested_list_values = [[[ 1,  2], [ 3, -4]],[[-1,  0]]]
    list(chain(*chain(*nested_list_values)))
    

    [1, 2, 3, -4, -1, 0]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多