【问题标题】:Python: How to vstack all the arrays of a column in a dataframe quickly?Python:如何快速 vstack 数据框中列的所有数组?
【发布时间】:2019-01-28 20:31:41
【问题描述】:

如何快速将一列的所有数组vstack成一个大数组?

例如:

Dataframe['Binary_feature'][0] = array([[1,0,0,0,1]]) Dataframe['Binary_feature'][1] = array([[0,1,0,1,0]]) ...... Dataframe['Binary_feature'][i] = array([[0,1,0,1,0]])

如何将“Binary_feature”列中的所有数组堆叠成一个数组,例如:

array([[1,0,0,0,1], [0,1,0,1,0], ... [0,1,0,1,0]])

【问题讨论】:

    标签: python arrays pandas numpy series


    【解决方案1】:

    你可以squeeze一个数组来移除大小为1的维度:

    s = pd.Series([np.array([[1,0,0,0,1]]),
                   np.array([[0,1,0,1,0]]),
                   np.array([[0,1,0,1,0]])])
    
    res = np.array(s.values.tolist()).squeeze()
    
    array([[1, 0, 0, 0, 1],
           [0, 1, 0, 1, 0],
           [0, 1, 0, 1, 0]])
    

    您会发现这比在您的系列中使用 np.vstack 更有效:

    s = pd.concat([s]*10000)
    
    assert (np.array(s.values.tolist()).squeeze() == np.vstack(s)).all()
    
    %timeit np.array(s.values.tolist()).squeeze()  # 25.2 ms per loop
    %timeit np.vstack(s)                           # 71.9 ms per loop
    %timeit np.vstack(s.values)                    # 66.8 ms per loop
    

    【讨论】:

    • 在此之前切勿使用挤压 :-) 不错
    • 好的。非常感谢。我会尝试所有的。 :)
    【解决方案2】:

    数据来自 jpp,vstack

    np.vstack(s.values)
    Out[216]: 
    array([[1, 0, 0, 0, 1],
           [0, 1, 0, 1, 0],
           [0, 1, 0, 1, 0]])
    

    【讨论】:

    • 完美!这很有效,而且很快。我只是想用 for 循环来解决这个问题,但我认为这会导致太多的成本。非常感谢。
    • @Yvonne.Tian yw:-) 快乐编码
    【解决方案3】:

    我觉得你可以用np.concatenate

    np.concatenate([df['Binary_feature']])
    

    统一更新: 在这种情况下应该是np.concatenate(df['Binary_feature'])

    【讨论】:

    • @jpp,他不想要这个吗?在他的例子中: array([[1,0,0,0,1], [0,1,0,1,0], ... [0,1,0,1,0]]) 是数组数组。
    • 不,不是。它是一个 单个数组,形状为 (n, 5),其中 n 是行数。
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2020-08-22
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多